pantheon-opencode 1.5.2 → 1.6.0-beta.10

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 (146) hide show
  1. package/.pantheon/code-mode/README.md +4 -2
  2. package/.pantheon/code-mode/checkpoint_session.py +138 -102
  3. package/.pantheon/code-mode/compress-inline.py +102 -57
  4. package/.pantheon/code-mode/manifest.json +2 -8
  5. package/AGENTS.global.md +182 -0
  6. package/AGENTS.md +10 -891
  7. package/CHANGELOG.md +343 -0
  8. package/README.md +577 -79
  9. package/README.pt-BR.md +345 -60
  10. package/bin/pantheon-init.mjs +26 -3
  11. package/commands/pantheon-audit.md +7 -1
  12. package/commands/pantheon-consolidate.md +1 -1
  13. package/commands/pantheon-deepwork.md +14 -3
  14. package/commands/pantheon-focus.md +17 -0
  15. package/commands/pantheon-optimize.md +2 -2
  16. package/commands/pantheon-vision.md +61 -12
  17. package/package.json +30 -11
  18. package/plugin.json +2 -2
  19. package/pyproject.toml +11 -16
  20. package/scripts/build-agents-md.mjs +376 -58
  21. package/scripts/changelog-merge.mjs +161 -0
  22. package/scripts/check-plugin-v2-coverage.mjs +213 -0
  23. package/scripts/ci-validate-yaml.py +7 -5
  24. package/scripts/{code_mode_server.py → code_mode.py} +119 -27
  25. package/scripts/cost.mjs +244 -41
  26. package/scripts/doctor.mjs +236 -29
  27. package/scripts/install/agents-md.mjs +4 -4
  28. package/scripts/install/cli-ui.mjs +1 -1
  29. package/scripts/install/config-migration.mjs +319 -6
  30. package/scripts/install/health-check.mjs +26 -37
  31. package/scripts/install/interactive.mjs +7 -7
  32. package/scripts/install/migrate.mjs +1 -1
  33. package/scripts/install/opencode-version.mjs +246 -4
  34. package/scripts/install/opencode.mjs +627 -179
  35. package/scripts/install/plugin.mjs +43 -9
  36. package/scripts/install/shared.mjs +120 -12
  37. package/scripts/install/vision-prompt.mjs +161 -0
  38. package/scripts/install-mcp.mjs +28 -9
  39. package/scripts/{mcp_persistence_server.py → mcp_persistence.py} +392 -78
  40. package/{src/mcp/mcp_resources_server.py → scripts/mcp_resources.py} +2 -2
  41. package/scripts/{memory_mcp_server.py → memory_mcp.py} +372 -198
  42. package/scripts/postinstall.mjs +0 -7
  43. package/scripts/probe-context-rehydrate.mjs +36 -13
  44. package/scripts/probe-pantheon-cost.mjs +71 -15
  45. package/scripts/prune.mjs +2 -2
  46. package/scripts/run-node-tests.mjs +189 -0
  47. package/scripts/sync-artifacts.mjs +26 -13
  48. package/scripts/sync-tui.mjs +24 -3
  49. package/scripts/test-opencode-v2-sandbox.sh +1913 -0
  50. package/scripts/validate-routing.mjs +43 -3
  51. package/scripts/validate-sandbox-install.mjs +138 -0
  52. package/scripts/versioning.mjs +13 -1
  53. package/scripts/vision-status.mjs +682 -0
  54. package/skills-lock.json +15 -16
  55. package/src/agents/aphrodite.md +20 -37
  56. package/src/agents/apollo.md +7 -3
  57. package/src/agents/athena.md +63 -35
  58. package/src/agents/demeter.md +8 -28
  59. package/src/agents/gaia.md +1 -1
  60. package/src/agents/hephaestus.md +10 -21
  61. package/src/agents/hermes.md +15 -38
  62. package/src/agents/iris.md +1 -1
  63. package/src/agents/mnemosyne.md +23 -60
  64. package/src/agents/nyx.md +1 -1
  65. package/src/agents/prometheus.md +16 -20
  66. package/src/agents/talos.md +10 -2
  67. package/src/agents/themis.md +5 -5
  68. package/src/agents/zeus.md +99 -130
  69. package/src/instructions/agent-return-format.instructions.md +18 -3
  70. package/src/instructions/backend-standards.instructions.md +2 -0
  71. package/src/instructions/frontend-standards.instructions.md +3 -1
  72. package/src/instructions/memory-protocol.instructions.md +11 -110
  73. package/src/instructions/zeus-anti-stall.instructions.md +14 -61
  74. package/src/instructions/zeus-communication-rules.instructions.md +0 -1
  75. package/src/instructions/zeus-council-synthesis.instructions.md +32 -260
  76. package/src/instructions/zeus-memory-operations.instructions.md +26 -0
  77. package/src/instructions/zeus-timeout-retry.instructions.md +40 -87
  78. package/src/mcp/{code_mode_server.py → code_mode.py} +119 -27
  79. package/src/mcp/eval_store.py +2 -2
  80. package/src/mcp/mcp_codemap_module.py +559 -129
  81. package/src/mcp/{mcp_persistence_server.py → mcp_persistence.py} +392 -78
  82. package/{scripts/mcp_resources_server.py → src/mcp/mcp_resources.py} +2 -2
  83. package/src/mcp/{memory_mcp_server.py → memory_mcp.py} +373 -250
  84. package/src/mcp/{pantheon_vision_server.py → pantheon_vision.py} +396 -40
  85. package/src/mcp/requirements-mcp.txt +10 -6
  86. package/src/mcp/requirements-vision.txt +4 -2
  87. package/src/pantheon/cost-command.ts +399 -101
  88. package/src/pantheon/delegation-enforce.ts +10 -1
  89. package/src/pantheon/model-command.ts +18 -7
  90. package/src/pantheon/presets.d.mts +0 -8
  91. package/src/pantheon/presets.mjs +5 -32
  92. package/src/pantheon/todo-enforcer.ts +1 -1
  93. package/src/pantheon/v2-bounded-read.ts +640 -0
  94. package/src/pantheon/v2-delegation-enforce.ts +214 -0
  95. package/src/pantheon/v2-execute-after.ts +186 -0
  96. package/src/pantheon/v2-tools.ts +429 -0
  97. package/src/pantheon/v2-unsupported.d.mts +11 -0
  98. package/src/pantheon/v2-unsupported.mjs +90 -0
  99. package/src/pantheon/v2-vision.ts +622 -0
  100. package/src/pantheon/vision-local.ts +531 -0
  101. package/src/pantheon/vision.ts +1161 -116
  102. package/src/plugin-v2.ts +1244 -288
  103. package/src/plugin.ts +12 -9
  104. package/src/plugins/tui/dist/server.d.ts +1 -2
  105. package/src/plugins/tui/dist/server.d.ts.map +1 -1
  106. package/src/plugins/tui/dist/tui-v2.d.ts +154 -0
  107. package/src/plugins/tui/dist/tui-v2.d.ts.map +1 -0
  108. package/src/plugins/tui/dist/tui-v2.js +659 -0
  109. package/src/plugins/tui/dist/tui-v2.js.map +1 -0
  110. package/src/plugins/tui/dist/tui.d.ts +85 -82
  111. package/src/plugins/tui/dist/tui.d.ts.map +1 -1
  112. package/src/plugins/tui/dist/tui.js +72 -59
  113. package/src/plugins/tui/index-v2.ts +6 -0
  114. package/src/plugins/tui/package-lock.json +5504 -1341
  115. package/src/plugins/tui/package.json +25 -15
  116. package/src/plugins/tui/src/index-v2.tsx +734 -0
  117. package/src/plugins/tui/src/index.tsx +106 -85
  118. package/src/plugins/tui/src/opencode-v2.d.ts +13 -0
  119. package/src/plugins/tui/tsconfig.build.json +5 -0
  120. package/src/plugins/tui/tsconfig.typecheck.json +5 -0
  121. package/src/plugins/tui/tsdown.config.ts +22 -2
  122. package/src/plugins/tui/tui-v2.ts +2 -0
  123. package/src/plugins/tui/tui.ts +3 -0
  124. package/src/routing.yml +11 -22
  125. package/src/skills/README.md +34 -39
  126. package/src/skills/agent-coordination/SKILL.md +7 -2
  127. package/src/skills/artifact-management/SKILL.md +12 -5
  128. package/src/skills/auto-continue/SKILL.md +54 -95
  129. package/src/skills/code-review-checklist/SKILL.md +5 -5
  130. package/src/skills/context-compression/SKILL.md +26 -879
  131. package/src/skills/session-goal/SKILL.md +14 -5
  132. package/src/skills/spec-driven-development/SKILL.md +3 -1
  133. package/src/skills/tdd-with-agents/SKILL.md +18 -10
  134. package/.pantheon/code-mode/eval-llm-judge.py +0 -255
  135. package/.pantheon/code-mode/eval-monte-carlo.py +0 -368
  136. package/.pantheon/code-mode/eval-run.py +0 -197
  137. package/.pantheon/code-mode/eval-static.py +0 -321
  138. package/.pantheon/code-mode/session-end-save.py +0 -186
  139. package/.pantheon/code-mode/session-end-save.sh +0 -18
  140. package/opencode.json +0 -58
  141. package/scripts/recover-zenodo-deposition.mjs +0 -146
  142. package/scripts/test-opencode-v1-v2-sandbox.sh +0 -862
  143. package/scripts/validate-zenodo-release.mjs +0 -154
  144. package/scripts/zenodo-artifact.mjs +0 -94
  145. package/scripts/zenodo-release-state.mjs +0 -53
  146. package/src/skills/orchestration-workflow/SKILL.md +0 -311
package/CHANGELOG.md CHANGED
@@ -18,6 +18,349 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
18
18
 
19
19
  ## ✅ Closed Issues
20
20
 
21
+ ## [v1.6.0-beta.10] - 2026-10-12
22
+
23
+ ## 🆕 What's New
24
+
25
+ - **Visible plan approval:** Zeus displays Athena's complete plan in the main
26
+ conversation before requesting approval, including for `/pantheon-deepwork`.
27
+ - **OpenCode V2 Vision:** adds `vision_describe` using the live image-capable
28
+ model catalog and OpenCode Zen authentication; relative image paths resolve
29
+ from the active project directory.
30
+
31
+ - **Menos contexto de instruções duplicadas no OpenCode V2:** regras comuns
32
+ entre as instruções globais e de projeto são emitidas uma vez, preservando
33
+ regras exclusivas. Na medição intercalada do beta-10 com OpenCode v2.0.29, o
34
+ proxy de contexto do primeiro request caiu 11,8%; input total e latência de
35
+ parede permanecem inconclusivos.
36
+
37
+ - **Admissão segura de subagents no OpenCode V2:** quando o host registra o
38
+ hook de permissões, Pantheon correlaciona o
39
+ agente, a sessão e o alvo do evento nativo `subagent` com o `source` da
40
+ avaliação de permissão, antes da criação da sessão filha. A matriz permite
41
+ Zeus→Apollo em uma sessão root e nega dispatches fora da matriz ou originados
42
+ em uma sessão filha. A canary isolada passou em 18/18 verificações no
43
+ OpenCode v2.0.29.
44
+
45
+ Evidência de F1 e F4A: `bench/results/f1-di-v229-interleaved-2026-10-14.md` e
46
+ `bench/results/f4a-v229-admission-identity-2026-10-14.md`. O resultado de
47
+ latência total e wall de F1 segue inconclusivo.
48
+
49
+ - **Especialista explícito como root no V2 (F3a):** no cenário one-shot B,
50
+ Talos iniciado explicitamente como agente root produziu o artefato correto
51
+ sem child em 5/5 runs na amostra inicial. Um recheck de integração posterior
52
+ encontrou 4/5; a instrução de Talos passou a exigir que arquivos pedidos
53
+ sejam realmente gravados com a ferramenta nativa. Uma nova coorte
54
+ pré-registrada passou em 5/5, sem children nem chamadas `subagent`. Nessa
55
+ coorte, o proxy de contexto do primeiro request foi 9.675 tokens para Talos
56
+ e 13.009 para Zeus (−25,6%, confirmado contra o spread intra-braço). Input
57
+ total e wall permanecem sem claim de ganho; não há claim de economia
58
+ monetária ou roteamento geral. O primeiro recheck e o follow-up são mantidos
59
+ separadamente em `bench/results/beta10-final-integration-2026-10-15.md` e
60
+ `bench/results/beta10-final-integration-followup-2026-10-15.md`; a evidência
61
+ inicial está em `bench/results/f3a-root-paired-2026-10-14.md`.
62
+
63
+ - **Leitura bounded no OpenCode V2:** adiciona `pantheon_bounded_read` para
64
+ sessões root do Zeus, com aprovação nativa por arquivo, sem grant persistente,
65
+ limites de chamadas/arquivos/linhas/bytes e scanner de segredos fail-closed.
66
+ Validado no OpenCode v2.0.29; detalhes e limitações em
67
+ `bench/results/f3b-v229-bounded-read-2026-10-15.md`.
68
+
69
+ ## [v1.6.0-beta.9] - 2026-10-12
70
+
71
+ <!-- Add new changes here. Running `node scripts/versioning.mjs apply` will
72
+ move this section to a versioned entry and reset the template below. -->
73
+
74
+ ## 🆕 What's New
75
+
76
+ - **Entry point TUI dedicado ao OpenCode V2.** O pacote agora compila e instala
77
+ separadamente os loaders V1/V2, e adiciona `/pantheon-focus` para foco de
78
+ sessão sem depender das goal-tools ausentes no host V2.
79
+
80
+ ## 🐞 Fixed
81
+
82
+ - **Instalação V2:** agentes e slash commands de projeto são instalados nos
83
+ diretórios descobertos pelo host; o TUI seleciona o bundle da geração correta
84
+ e o estado dos componentes só é marcado como instalado após sucesso.
85
+ - **`/pantheon-audit`:** inclui o scanner heurístico no pacote e localiza a cópia
86
+ instalada antes de executar a primeira camada.
87
+ - **`/pantheon-consolidate`:** delega a consolidação ao agente Mnemosyne, dono
88
+ da qualidade do banco de memória.
89
+
90
+ ## ⚠️ Known Issues
91
+
92
+ - **Sidebar V2 na sessão inicial:** a captura do TUI recém-aberto ainda não
93
+ mostra o conteúdo Pantheon antes do primeiro prompt; validar o render inicial
94
+ interativo continua sendo um gate aberto para a beta.
95
+ - **Goal persistente no OpenCode V2:** as goal-tools não fazem parte da
96
+ superfície V2 suportada; `/pantheon-focus` não substitui uma goal-tool
97
+ persistente/removível do host.
98
+
99
+ ## [v1.6.0-beta.8] - 2026-10-11
100
+
101
+ <!-- Add new changes here. Running `node scripts/versioning.mjs apply` will
102
+ move this section to a versioned entry and reset the template below. -->
103
+
104
+ ## 🐞 Fixed
105
+
106
+ - **opencode-v2** — repair session lookup and beta sandbox reuse
107
+ - **scripts** — isolate beta background service port
108
+ ## [v1.6.0-beta.7] - 2026-10-10
109
+
110
+ <!-- Add new changes here. Running `node scripts/versioning.mjs apply` will
111
+ move this section to a versioned entry and reset the template below. -->
112
+
113
+ ## 🆕 What's New
114
+
115
+ - **Permissões MCP nativas por agente no OpenCode V1 e V2.** O instalador
116
+ converte a allowlist `mcp_tools` de cada agente em regras nativas: nega por
117
+ padrão os servidores Pantheon omitidos, libera apenas as ferramentas
118
+ declaradas e preserva MCPs de terceiros. O V2 mantém os servidores
119
+ conectados; as regras limitam quais ferramentas cada agente vê.
120
+ - **Guarda V2 de delegação alinhada ao contrato de permissões.** Os hooks de
121
+ permissão e de sessão aplicam as restrições de sessão somente-leitura e a
122
+ matriz caller→target sem conceder acesso além do configurado pelo host.
123
+ - **Menos chamadas automáticas de memória e compressão.** A busca de contexto
124
+ do Zeus reutiliza o resultado de início de tarefa, e o protocolo de
125
+ compressão deixa de recomendar pipelines automáticos extensos.
126
+ - **Prova de identidade da instalação do sandbox.** O teste global compara a
127
+ versão e arquivos do pacote instalado com este checkout e rejeita referências
128
+ npm antigas nas configurações ativas antes de validar o runtime.
129
+ - O `--prepare` agora gera `start-pantheon.sh` para abrir o TUI interativo com o
130
+ beta instalado e HOME, configuração XDG, projeto e banco de dados isolados do
131
+ sandbox. O launcher fixa a porta do serviço gerenciado em `49376` e falha sem
132
+ parar serviços existentes se a porta dedicada já estiver ocupada.
133
+
134
+ ## 🐞 Fixed
135
+
136
+ - Referências versionadas/alias do pacote Pantheon que sobravam na lista
137
+ `plugins` agora são reconhecidas pelo instalador e substituídas pelo caminho
138
+ do plugin local correto, sem afetar plugins de terceiros com nomes parecidos.
139
+ - A suíte CI foi separada do caminho crítico de instalação/empacotamento para
140
+ reduzir o tempo até o resultado das verificações do pacote.
141
+ - O `run-test.sh` gerado agora define seu timeout do `mcp list` antes do uso
142
+ sob `set -u`; antes, a variável ausente interrompia o teste antes de chamar
143
+ o CLI. A saída do comando também fica disponível quando o gate falha.
144
+
145
+ ## ⚠️ Known Issues
146
+
147
+ - **A delegação real ainda precisa de confirmação nesta beta.** O teste manual
148
+ anterior de `HERMES-PONG` foi negado com
149
+ `Pantheon delegation denied: authoritative caller session is unavailable`;
150
+ a correção de permissões e a instalação isolada precisam ser verificadas no
151
+ TUI OpenCode V2 antes de considerar a delegação validada.
152
+ ## [v1.6.0-beta.6] - 2026-10-05
153
+
154
+ <!-- Add new changes here. Running `node scripts/versioning.mjs apply` will
155
+ move this section to a versioned entry and reset the template below. -->
156
+
157
+ ## 🆕 What's New
158
+
159
+ - **Política de suporte documentada: a linha 1.6.x é a ÚLTIMA compatível com OpenCode 1.X.** A partir de **1.7, toda release é breaking change com alvo em OpenCode 2.** O limite está escrito no `README.md` (seção "Compatibility and support policy", com matriz de suporte) e em `docs/INSTALLATION.md` (seção "OpenCode V1/V2 — contrato de plugin"), não duplicado em um documento novo: os dois arquivos já eram o ponto de entrada do contrato de plugin, e um terceiro documento seria um terceiro lugar para divergir. O texto distingue as duas células da linha 1.6.x — a célula 1.X é o contrato V1 (6 tools, lifecycle do board, hooks V1, compaction V1) e a célula OpenCode 2 é o contrato V2, que é real porém **menor**: 3 tools, sem as `pantheon_goal_*` e sem a matriz de delegação caller→target. **O suporte a OpenCode 2 na linha 1.6 é documentado como parcial, e não como completo**, por duas razões verificadas: (a) o canário de ferramentas V2 foi escrito contra `opencode 2.0.22`, host que não é publicado em nenhum canal npm — contra o `@opencode-ai/cli` instalável o mesmo canário falha 12/12, porque `/api/experimental/session/{id}/wait` foi promovido para `/api/session/{id}/wait` (404 no caminho antigo) e `ctx.tool.list` não existe mais; corrigindo apenas a rota, 10/12 passam no mesmo host, o que caracteriza descasamento canário/host e não regressão medida do plugin (issue #216, PR #213); (b) não existe perna V1 de validação end-to-end — `scripts/test-opencode-v2-sandbox.sh` é V2-only e rejeita `--run v1` — portanto a versão exata de host 1.X exercitada end-to-end pela linha 1.6 fica registrada como **não verificada**, e o caminho 1.X é sustentado pelo pin de dependência (`@opencode-ai/plugin` / `@opencode-ai/sdk` `1.18.33`), pelos testes unitários do gate de geração e pelos testes end-to-end do installer sobre a config emitida.
160
+
161
+ ## 🐞 Fixed
162
+
163
+ - **Os exemplos de chamada MCP nos arquivos de prompt ensinavam um contrato que não existe no schema real.** Um `pantheon-persistence.kv_get` ao vivo foi rejeitado com `namespace: Missing key`; a linha que o produziu foi `src/agents/zeus.md:189` (`depth = kv_get("deleg:depth") ?? 0`), cuja cópia instalada em `~/.config/opencode/agents/zeus.md` é a que executou. A causa não era o servidor MCP: os arquivos de agente e de instrução ensinavam chamadas posicionais sem `namespace`, enquanto o schema real é `kv_get({ namespace /* obrigatório, sem default */, key, scope? })` — `kv_store.namespace` é igualmente obrigatório e `kv_store.value` é `str`. **A correção está nos docs, e não em adicionar um `namespace` default:** um default escreveria estado de coordenação no namespace errado silenciosamente, então *obrigatório* é o desenho correto. A mesma classe de defeito foi corrigida em `context_save` (posicional, com um helper `json()` inexistente e sem o `session_id` obrigatório → forma por palavra-chave com `content=JSON.stringify(...)`), em `memory_store` (`value` precisa ser uma string JSON codificada → agora iguala o padrão já correto de `metadata`, o que resolveu uma aut contradição no mesmo arquivo), na aritmética de profundidade (envolvida em `String(...)`, porque `kv_store.value` é `str` e não `int`) e em `memory_search(query, ...)` → `query=` em todas as instâncias. `AGENTS.md` é artefato gerado e foi reconstruído, nunca editado à mão.
164
+ - **Um bypass de permissão vivo: `edit: deny` não cobria `hashline_edit`.** A regra `edit: deny` é avaliada por nome de ferramenta, e `hashline_edit` não é `edit` — então os agentes restritos a `edit: deny` (`zeus`, `athena`, `iris`, `nyx`, `themis`) podiam editar arquivos assim mesmo, escrevendo no disco por um caminho que a negação não cobria. `hashline_edit: deny` foi adicionado a esses cinco agentes. **Não era uma condição de corrida nem um erro de configuração: era uma tabela de permissões incompleta**, o que significa que a negação nunca esteve de fato aplicada a quem só deveria ler.
165
+ - **`test:node` reportava sucesso tendo coletado zero testes.** `node --test <glob>` sai com 0 quando o glob não expande (Node >= 22), e foi exatamente o que aconteceu: um glob que nunca expandiu produziu um gate verde que não executou nada. Pior, `tests/` estava ausente da allow-list `files` do pacote, então um consumidor que rodasse `npm test` recebia esse verde. Agora os scripts de teste falham em voz alta quando a coleta é zero, e a guarda tem teste próprio (`tests/run-node-tests.test.mjs`) que a dirige como subprocesso — o contrato é o código de saída, então testá-la em processo não provaria nada.
166
+ ## [v1.6.0-beta.5] - 2026-10-05
167
+
168
+ &lt;!-- Add new changes here. Running `node scripts/versioning.mjs apply` will
169
+ move this section to a versioned entry and reset the template below. --&gt;
170
+
171
+ ## 🆕 What's New
172
+
173
+ - **O gate de geração do plugin passa a ler a versão do host — e a superfície de ferramentas deixa de desaparecer num host OpenCode 2.x.** O seletor de geração tinha três defaults `'v1'` (`bin/pantheon-init.mjs`, `scripts/install/opencode.mjs` e a assinatura do resolver em `scripts/install/opencode-version.mjs`). Nesse ramo, o installer grava caminhos de arquivo `.ts` na chave singular `plugin`; um host 2.x rejeita caminhos de arquivo ali (`configured plugin path must be a directory`), **descarta** as entradas e, ao fazer isso, **remove** a entrada de diretório V2 que já estava registrada e funcionando. O sintoma era um host aparentemente saudável — a frota MCP subia normalmente — com um único WARN no log e **nenhuma** ferramenta do plugin no catálogo: sem `pantheon_cost`, sem `hashline_edit`, sem `pantheon_model`, sem BackgroundJobBoard e sem hooks. Os três defaults passam a `'auto'`, e `auto` consulta a versão do host. Precedência: flag explícita > `OPENCODE_VERSION` > basename `opencode2` > probe de `--version` > aviso e fallback `v1`. Isto restaura as **3** ferramentas que o contrato V2 registra (`hashline_edit`, `pantheon_cost`, `pantheon_model`); não é paridade com o V1 — ver **Issues Conhecidas**.
174
+ - **Uma instalação na geração V2 e o `doctor` agora declaram a superfície reduzida em vez de deixá-la ser descoberta.** A lista de recursos não suportados no V2 (`getUnsupportedFeatures()`) não tinha nenhum consumidor em produção — só testes a liam. O installer passa a imprimi-la ao lado do aviso de destino V2, e o `doctor` a reporta como um achado próprio, sem alterar o código de saída (uma instalação V2 é uma configuração suportada, não quebrada). A V2 registra 3 ferramentas, não 6, e não tem BackgroundJobBoard; as 3 ferramentas de goal não são registradas na V2 por desenho. O texto agora é único, vindo de `src/pantheon/v2-unsupported.mjs`.
175
+ - **Renomeação dos entrypoints MCP (issue #198).** Os cinco entrypoints Python deixaram de compartilhar o token `server.py`, então um `pkill -f server.py` amplo não derruba mais a frota inteira como efeito colateral. Inclui uma migração em tempo de instalação para que as instalações existentes não fiquem órfãs.
176
+ - **O pacote npm deixou de versionar e distribuir a configuração pessoal de desenvolvimento do OpenCode.** `opencode.json` e `.opencode/` (comandos, plugins e skills) saíram do controle de versão: a config carregava um endpoint MCP privado e overrides de permissão por desenvolvedor, e o harness V1 de comandos/plugins foi substituído por `src/plugin-v2.ts`. O `init` continua gerando a config do projeto do usuário, então instalações não são afetadas; para contribuidores, um `opencode.json` pessoal deve ir em `.git/info/exclude`.
177
+ - **Documentação: `ROADMAP.md` reescrito e um novo documento de fronteira.** O roadmap foi reescrito com as causas-raiz verificadas, e um novo documento — `docs/PERMISSIONS-QUALITY-DELEGATION.md` — mapeia os gates de qualidade, as quatro camadas de permissão e a delegação num só lugar, marcando explicitamente o que ainda não foi verificado.
178
+
179
+ ## 🐞 Fixed
180
+
181
+ - **A leitura do banner de versão do host era quadrática.** Um banner longo custava **11,1 s** para ser interpretado, contra o timeout de **5 s** do spawn de `--version`; o timeout guarda o processo, não a leitura, então um host verboso conseguia estourá-lo. A interpretação passou a ser **linear**.
182
+ - **O `readOnlyRegistry` do V2 não era podado no `session.deleted`.** O registro é global ao processo e nunca era limpo quando uma sessão do V2 terminava, então entradas de sessões encerradas acumulavam. O `session.deleted` do V2 passa a podar o registro, como a V1 já fazia.
183
+
184
+ ## ⚠️ Known Issues
185
+
186
+ - **Ação necessária: re-executar o `init` numa instalação afetada.** O `postinstall` **não** roda o `init`. Quem teve a configuração corrompida por uma instalação `v1` anterior **não** é auto-corrigido apenas por atualizar o pacote — é preciso rodar o installer de novo (`npx pantheon-opencode init`). Uma escolha correta de geração **auto-corrige** a configuração (o ramo V2 já remove as referências `.ts` do V1), mas só quando o installer roda. O mesmo vale para a renomeação dos entrypoints: instalações existentes continuam funcionando porque os arquivos antigos são mantidos, mas os caminhos só são corrigidos numa nova execução do installer; até lá, esses usuários permanecem nos entrypoints antigos e sujeitos ao efeito colateral do `server.py`.
187
+ - **A superfície V2 é menor que a V1 por desenho.** A V2 registra 3 ferramentas (`hashline_edit`, `pantheon_cost`, `pantheon_model`), não 6, e não tem BackgroundJobBoard; as 3 `pantheon_goal_*` são V1-only e a matriz de delegação caller→target não é replicada. O installer e o `doctor` agora **dizem** isso (ver What's New), mas a funcionalidade ausente não é restaurada.
188
+ - **O fallback continua a ser `v1`.** Quando o probe do host falha, não consegue ser interpretado, ou traz versões contraditórias, o resolver avisa **uma vez** e cai para `v1`, em vez de arriscar um host 1.x com uma entrada `plugins` que ele ignoraria. É um erro alto e visível, mas ainda é uma queda para a configuração V1.
189
+
190
+ ## ✅ Closed Issues
191
+
192
+ - **A justificativa da matriz de delegação V1→V2 foi corrigida.** O texto dizia que o V2 "não expõe esse caminho de semeadura"; os tipos do SDK refutam isso. A causa real da matriz não replicada não é a ausência de um caminho de semeadura (`session.created` do V2 traz `properties.info: Session` com `parentID?`, o mesmo campo que a V1 semeia), mas a *segunda* fonte da V1 — o seed de `client.session.list()` para sessões anteriores ao carregamento do plugin — porque o `PluginContext` do V2 não expõe `client`. Se um host 2.0.22 ao vivo popula `info.parentID` nesse evento continua **não verificado** (nenhum canário lê payload de evento). A linha publicada em `v1.6.0-beta.4` fica como registro.
193
+ ## [v1.6.0-beta.4] - 2026-10-03
194
+
195
+ &lt;!-- Add new changes here. Running `node scripts/versioning.mjs apply` will
196
+ move this section to a versioned entry and reset the template below. --&gt;
197
+
198
+ ## 🆕 What's New
199
+
200
+ - **Canário host-backed que dirige `hashline_edit` end-to-end** (`tests/canary/plugin-v2-tool-canary.test.mjs`, 12 casos): carrega `src/plugin-v2.ts` pelo loader real do host `opencode 2.0.22` e registra `Object.keys(ctx)` de dentro do host — medidos, `tool`/`event`/`permission`/`session` existem e `catalog` não. É o primeiro gate que dirige uma ferramenta do Pantheon por um host real. O canário existente só dirige o `read` embutido, e foi por isso que `draft.add()` sem `output` sobreviveu 26 dias com todos os testes verdes.
201
+ - **Os quatro domínios que o SDK `@opencode-ai/plugin` não tipa** (`tool`, `event`, `permission`, `session`) passaram a uma declaração estrutural local (`HostPluginContext`) e **um** cast documentado (`hostDomains()`), no lugar de seis `as unknown as Record<string, unknown>` que não verificavam tipo nenhum. Todo membro continua opcional e todo chamador reconferir antes de usar. A linha estável do SDK é `1.18.x` e não carrega o contrato do host — `1.18.34` (`latest`) é idêntica a `1.18.33`, então seguir o `dev` diário resolveria pior, não melhor.
202
+
203
+ ## 🐞 Fixed
204
+
205
+ - `pantheon_cost` respondia `CORRUPT_DATA` em **toda** chamada contra o host 2.0.22: exigia a tabela `message`, que não existe nesse banco. Os tokens de assistant **estão** legíveis em `session_message`. **Não é renomeação:** `session_message` tem coluna `data`, mas não tem a chave `role` dentro dela — `json_type(data,'$.role')` é nulo em **0 de 40 307** linhas válidas. O V1 marca turnos de assistant com `data.role`; o V2 marca pela **coluna** `type`. Trocar apenas o nome da tabela casaria com nada e devolveria `status: OK` em silêncio. A detecção passa a ser por **presença de tabela**, porque as duas famílias coexistem em bancos migrados.
206
+ - `PANTHEON_OPENCODE_VERSION` nunca selecionou o schema: só mudava o **nome do arquivo**, e `opencode-v2.db` é o isolamento do sandbox via `OPENCODE_DB`, não um banco de host 2.x. A distinção v1/v2 é o **schema detectado**; a variável agora apenas restringe um conjunto já detectado e falha rápido quando pede uma família ausente.
207
+ - `scripts/cost.mjs` duplicava o mesmo bug literal, com o mesmo assert — o fallback continuava morto. `probe-pantheon-cost.mjs` acompanha.
208
+ - O report agora **declara a cobertura temporal** que ele mediu (janela varrida, linha mais antiga), em vez de apresentar totais como se cobrissem meses.
209
+
210
+ ## ⚠️ Known Issues
211
+
212
+ - O canário **host-backed pula no CI**: o runner não tem binário `opencode`. O skip é **visível** no log (`::notice`), e os dois casos sem host rodam incondicionalmente, com `PANTHEON_TOOL_CANARY_BIN` apontado para um caminho inexistente. Rodar de verdade exige um modo no script de sandbox — **não feito**.
213
+ - A cobertura de custo do banco v2 é de **~8,3 dias** nesta máquina (primeiro registro em 2026-09-25). O histórico v1 (~96 dias) fica num diretório irmão com nome de epoch, que **não** é contrato e por isso não é descoberto automaticamente. Quem quiser aponta `PANTHEON_COST_DB`.
214
+ - `metadata.phase` nunca existiu em v1 nem em v2 — medido: 0 linhas de `session_message` têm `$.metadata.phase` nem `$.phase`. A coluna Phase sempre foi `unknown`. Não é regressão, é feature que nunca funcionou.
215
+ ## [v1.6.0-beta.3] - 2026-10-03
216
+
217
+ &lt;!-- Add new changes here. Running `node scripts/versioning.mjs apply` will
218
+ move this section to a versioned entry and reset the template below. --&gt;
219
+
220
+ ## 🆕 What's New
221
+ - **Três ferramentas V2 agora executam de verdade**: `hashline_edit`,
222
+ `pantheon_cost` e `pantheon_model` rodam no host `opencode v2.0.x`. Antes
223
+ eram placeholders que declaravam sucesso sem fazer nada.
224
+ - **Enforcement de sessão read-only no caminho V2**: `apollo` e `gaia` voltam
225
+ a ter escrita bloqueada, com o guard registrado no próprio plugin V2 — sem
226
+ depender de uma ponte que a instalação V2 não monta.
227
+ - **Varredura de segredos de alta confiança no caminho V2**: o único hard block
228
+ de segurança que a V1 tinha, e que estava inerte por viver num plugin que a
229
+ instalação V2 não carrega, passa a rodar.
230
+
231
+ ## 🐞 Fixed
232
+ - **As 6 ferramentas de plugin do V2 falhavam em 100% das chamadas**:
233
+ `hashline_edit`, `pantheon_cost` e `pantheon_model` lançavam
234
+ `Tool result declared output without an output schema` em toda invocação. A
235
+ causa era assimetria local — `draft.add()` não declarava `output` enquanto o
236
+ `execute` resolvia `{ output: string }`. O host exige simetria nos dois
237
+ sentidos: resultado com `output` e nenhuma declaração lança, assim como
238
+ declaração sem `output` no resultado. `output` passou a ser **obrigatório** na
239
+ interface `V2ToolDef`, então o compilador exige a declaração daqui em diante.
240
+ - **A suíte exigia o defeito**: `tests/pantheon/plugin-v2-contract.test.ts`
241
+ afirmava que o resultado carregava `.output` string — literalmente a condição
242
+ de falha, contra um mock que não reproduzia a exigência do host. O teste foi
243
+ reescrito para o invariante de simetria, contra um mock que constrói o
244
+ `outputSchema` a partir de `def.output` como o host faz
245
+ (`output: I.outputSchema ?? {}`), cobrindo as duas direções do bicondicional.
246
+ - **A imposição read-only não existia na superfície V2**: `createEnforcementGuard`
247
+ só era instanciado em `src/plugin.ts`, que o `opencode.json` da release não
248
+ declara — V2 nunca carrega V1. Com `hashline_edit` funcional, uma sessão
249
+ somente-leitura podia escrever arquivos. O guard passou a ser registrado no
250
+ hook `execute.before` do V2, e `pantheon_model` — que escreve
251
+ `active-preset.json` em escopo project e global — foi acrescentado a
252
+ `DEFAULT_BLOCKED_TOOLS`, o que corrige também a V1. `pantheon_cost` ficou de
253
+ fora de propósito: só lê `opencode.db`.
254
+ - **O único hard block de segurança da V1 estava inerte**: o scan de segredos de
255
+ alta confiança vivia em `src/plugins/pantheon-hooks.ts`, um plugin que a
256
+ instalação V2 não carrega — inerte por construção, não por má configuração.
257
+ Passou a rodar dentro do `execute.before` do V2
258
+ (`scripts/hooks/scan-secrets.sh`; exit 2 bloqueia, exit 1 é advisory e só
259
+ registra). O caminho do script foi verificado a partir do tarball instalado,
260
+ não só do repo.
261
+ - **Cinco comentários afirmavam cobertura que não existe** ("wired through the
262
+ V1…"). Corrigidos — é o defeito "anunciado como vivo, morto no caminho", a
263
+ mesma classe do bug original, transferida do tool para o controle de segurança.
264
+
265
+ ## ⚠️ Known Issues
266
+ - **A release entrega 3 ferramentas V2 funcionais, não 6**:
267
+ `pantheon_goal_create`, `pantheon_goal_get` e `pantheon_goal_update` foram
268
+ **removidos** da superfície V2. `GoalLoopDeps` exige `store`, `client` e
269
+ `board`, que não existem no `PluginContext` V2, e a bridge V1 resolve para
270
+ `null` fora da V1. Registrá-las como placeholders não funcionais seria pior
271
+ que a ausência: anunciá-las seria mentira silenciosa. Marcador `goal-tools`
272
+ em `V2_UNSUPPORTED_FEATURES`. **Breaking** para quem usava esses tools no
273
+ host V2 — o contrato V1 permanece disponível para o goal loop.
274
+ - **A matriz de delegação nativa da V1 não é replicada na V2**: o guard V2 cobre
275
+ a lista de ferramentas bloqueadas, mas não a matriz caller→target nem a negação
276
+ de `task` em sessão filha. A matriz precisa de uma hierarquia de sessões
277
+ semeada a partir dos metadados de sessão, e o V2 não expõe esse caminho de
278
+ semeadura — `SessionHierarchyRegistry.isRoot` reporta `true` para sessões
279
+ desconhecidas enquanto não semeada, então semeá-la pela metade negaria todo
280
+ `task()`. O branch é pulado em vez de negado indiscriminadamente. Marcador
281
+ `delegation-matrix`. `task` continua negada em sessão somente-leitura pela
282
+ lista de ferramentas bloqueadas, então a profundidade 2 se sustenta; o que
283
+ não existe é a matriz. Coberto por `experimental.subagent_depth` nesta
284
+ configuração, mas a garantia do plugin não existe.
285
+ - **O log do scan de segredos escreve só em `.pantheon/logs/hooks.log`**: o
286
+ `PluginContext` V2 não expõe `client` nem `directory`, então os canais de log
287
+ estruturado e de toast da V1 não existem nessa superfície. É menos
288
+ observabilidade, não menos bloqueio.
289
+ - **Falha de infraestrutura do scanner é fail-open por decisão**: script ausente
290
+ ou timeout não bloqueiam. `runHook` nunca rejeita e um erro de infraestrutura
291
+ não deve negar chamadas não relacionadas. Ausência do script não bloqueia.
292
+
293
+ ## ✅ Closed Issues
294
+ - **Drift de documentação no `README.pt-BR.md`**: a tabela de contrato de
295
+ runtime e o parágrafo de superfície listavam 6 ferramentas V2 e as 3 de goal,
296
+ que não estão registradas. Corrigido para 3 ferramentas, com a razão da
297
+ ausência e o ponto de imposição read-only.
298
+ - **Cinco comentários de falsa cobertura** sobre a imposição read-only e o scan
299
+ de segredos.
300
+ - **Shim do loader JSON do ajv elevado a bootstrap de módulo**: o patch de
301
+ `Module._extensions['.json']` era aplicado de dentro de `loadAjv()` e ficava
302
+ vivo durante todo o run, podendo vazar entre arquivos de teste e se manifestar
303
+ longe da causa. Agora instala, carrega e restaura em nível de módulo, antes de
304
+ qualquer corpo de teste, com `finally`.
305
+ ## [v1.6.0-beta.2] - 2026-10-02
306
+
307
+ ## 🆕 What's New
308
+ - **`steps` não é mais definido pelo Pantheon**: removido dos 14 agentes em
309
+ `src/agents/`. No OpenCode 2 o campo é opcional e **sem default** — ausente
310
+ significa **sem teto nativo**. O host não impõe teto; o Pantheon estava
311
+ escrevendo um.
312
+ - **Instalador v2 remove `steps` residual**: configs já instalados passam a ter
313
+ o `steps` apagado dos agentes gerenciados. Escopo restrito aos agentes que o
314
+ Pantheon gerencia — um agente definido pelo usuário nunca é tocado. O bloco V1
315
+ singular `agent` é deliberadamente intocado (V1 em retirada).
316
+ - **Substitutos ao teto**: `task(background=true)` para trabalho fora da
317
+ foreground, `experimental.subagent_depth` para aninhamento de subagentes e
318
+ paralelismo entre delegações independentes.
319
+ - **Limpeza**: `max_steps` e `max_compaction_items` removidos de
320
+ `src/routing.yml`. `loadRoutingMaxSteps` nunca teve um único import — 2
321
+ matches no repo (definição e typedef), ambos removidos.
322
+
323
+ ## 🐞 Fixed
324
+ - **`migrateV1toV2` descartava campos gerenciados**: com os blocos `agent` (V1)
325
+ e `agents` (V2) coexistindo — o caso de qualquer config já instalado — o
326
+ spread raso fazia um substituir o outro por inteiro. Na ordem de chaves do
327
+ `opencode.json` real, o lado perdedor era o do usuário. Agora **mescla**: a
328
+ base é o bloco V2, os campos gerenciados do V1 sobrescrevem, e os campos do
329
+ usuário são preservados. Mesma semântica já usada em `install/opencode.mjs`.
330
+ - **`docs/platforms/README.md` tinha tabela de step limits errada**: 14 linhas
331
+ listando limites por agente, **nenhum valor batendo** com `src/agents/`.
332
+ Tabela removida e a seção reescrita.
333
+
334
+ ## ⚠️ Known Issues
335
+ - **Permissões de agente**: V1 usa `permission` e V2 usa `permissions`; ao mesclar esses blocos, a chave legada `permission` pode permanecer inerte ao lado de `permissions`.
336
+ - **Migração — rode o init uma vez**: `npx pantheon-opencode init
337
+ --opencode-version=v2` **uma única vez** limpa o `steps` residual. Sem isso o
338
+ config instalado continua carregando o teto antigo.
339
+ - **O `.md` de agente instalado é sobrescrito no próximo sync**: editar
340
+ `~/.config/opencode/agents/*.md` esperando persistência **não funciona**.
341
+ Comportamento **pré-existente**, não é regressão desta mudança — mas agora
342
+ está documentado para não ser reportado como uma.
343
+ - **`steps` definido à mão num agente gerenciado é removido a cada install v2**:
344
+ o instalador não distingue um valor que ele escreveu de um valor que você
345
+ escreveu (mesma chave, mesmo valor). Workaround: definir no frontmatter do
346
+ agente — e lembrar que ele **também** é sobrescrito no próximo sync.
347
+ ## [v1.6.0-beta.1] - 2026-09-30
348
+
349
+ <!-- Add new changes here. Running `node scripts/versioning.mjs apply` will
350
+ move this section to a versioned entry and reset the template below. -->
351
+
352
+ ## 🆕 What's New
353
+ - **OpenCode 2** — first Pantheon beta compatible with the OpenCode 2 plugin
354
+ contract.
355
+ - **memory** — preserve SQLite FTS5/BM25 keyword search and the `code_*` codemap
356
+ tools.
357
+
358
+ ## 🐞 Fixed
359
+ - **memory** — remove the legacy vector-memory scripts and embedding/KNN/RRF
360
+ path.
361
+ - **CI/release** — keep validation fail-closed; expand `doctor` checks and add
362
+ the OpenCode 2 V2-only sandbox validator.
363
+
21
364
  ## [v1.5.2] - 2026-09-22
22
365
 
23
366
  ## 🐞 Fixed