pantheon-opencode 1.6.0-beta.1 → 1.6.0-beta.11

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 (133) hide show
  1. package/AGENTS.global.md +206 -0
  2. package/AGENTS.md +10 -891
  3. package/CHANGELOG.md +350 -0
  4. package/README.md +561 -52
  5. package/README.pt-BR.md +285 -20
  6. package/bin/pantheon-init.mjs +70 -4
  7. package/commands/pantheon-audit.md +7 -1
  8. package/commands/pantheon-consolidate.md +1 -1
  9. package/commands/pantheon-deepwork.md +14 -3
  10. package/commands/pantheon-focus.md +17 -0
  11. package/commands/pantheon-vision.md +61 -12
  12. package/package.json +24 -17
  13. package/plugin.json +2 -2
  14. package/pyproject.toml +8 -6
  15. package/scripts/build-agents-md.mjs +428 -56
  16. package/scripts/changelog-merge.mjs +161 -0
  17. package/scripts/{code_mode_server.py → code_mode.py} +3 -3
  18. package/scripts/cost.mjs +244 -41
  19. package/scripts/doctor.mjs +151 -1
  20. package/scripts/install/agents-md.mjs +4 -4
  21. package/scripts/install/backup.mjs +475 -0
  22. package/scripts/install/cli-ui.mjs +6 -1
  23. package/scripts/install/config-migration.mjs +317 -4
  24. package/scripts/install/exit-codes.mjs +26 -0
  25. package/scripts/install/health-check.mjs +21 -19
  26. package/scripts/install/interactive.mjs +16 -2
  27. package/scripts/install/migrate.mjs +41 -22
  28. package/scripts/install/opencode-version.mjs +246 -4
  29. package/scripts/install/opencode.mjs +1175 -215
  30. package/scripts/install/plan.mjs +287 -0
  31. package/scripts/install/plugin.mjs +62 -14
  32. package/scripts/install/shared.mjs +190 -48
  33. package/scripts/install/strings.mjs +20 -0
  34. package/scripts/install/venv.mjs +13 -3
  35. package/scripts/install/vision-prompt.mjs +171 -0
  36. package/scripts/install-mcp.mjs +28 -9
  37. package/scripts/{mcp_persistence_server.py → mcp_persistence.py} +52 -17
  38. package/{src/mcp/mcp_resources_server.py → scripts/mcp_resources.py} +2 -2
  39. package/scripts/{memory_mcp_server.py → memory_mcp.py} +2 -2
  40. package/scripts/probe-context-rehydrate.mjs +8 -2
  41. package/scripts/probe-pantheon-cost.mjs +71 -15
  42. package/scripts/prune.mjs +9 -3
  43. package/scripts/restore.mjs +222 -0
  44. package/scripts/run-node-tests.mjs +189 -0
  45. package/scripts/sync-artifacts.mjs +26 -13
  46. package/scripts/sync-tui.mjs +24 -3
  47. package/scripts/test-opencode-v2-sandbox.sh +180 -26
  48. package/scripts/validate-routing.mjs +3 -3
  49. package/scripts/validate-sandbox-install.mjs +138 -0
  50. package/scripts/versioning.mjs +13 -1
  51. package/scripts/vision-status.mjs +682 -0
  52. package/skills-lock.json +8 -8
  53. package/src/agents/aphrodite.md +20 -37
  54. package/src/agents/apollo.md +7 -3
  55. package/src/agents/athena.md +63 -35
  56. package/src/agents/demeter.md +8 -28
  57. package/src/agents/gaia.md +1 -1
  58. package/src/agents/hephaestus.md +10 -21
  59. package/src/agents/hermes.md +15 -38
  60. package/src/agents/iris.md +7 -1
  61. package/src/agents/mnemosyne.md +18 -54
  62. package/src/agents/nyx.md +1 -1
  63. package/src/agents/prometheus.md +16 -20
  64. package/src/agents/talos.md +10 -2
  65. package/src/agents/themis.md +5 -5
  66. package/src/agents/zeus.md +99 -172
  67. package/src/instructions/agent-return-format.instructions.md +34 -17
  68. package/src/instructions/backend-standards.instructions.md +2 -0
  69. package/src/instructions/frontend-standards.instructions.md +3 -1
  70. package/src/instructions/memory-protocol.instructions.md +12 -110
  71. package/src/instructions/test-economy.instructions.md +21 -0
  72. package/src/instructions/zeus-anti-stall.instructions.md +20 -67
  73. package/src/instructions/zeus-communication-rules.instructions.md +0 -1
  74. package/src/instructions/zeus-council-synthesis.instructions.md +31 -260
  75. package/src/instructions/zeus-memory-operations.instructions.md +30 -0
  76. package/src/instructions/zeus-timeout-retry.instructions.md +61 -89
  77. package/src/mcp/{code_mode_server.py → code_mode.py} +3 -3
  78. package/src/mcp/eval_store.py +2 -2
  79. package/src/mcp/{mcp_persistence_server.py → mcp_persistence.py} +52 -17
  80. package/{scripts/mcp_resources_server.py → src/mcp/mcp_resources.py} +2 -2
  81. package/src/mcp/{memory_mcp_server.py → memory_mcp.py} +2 -2
  82. package/src/mcp/{pantheon_vision_server.py → pantheon_vision.py} +286 -42
  83. package/src/mcp/requirements-mcp.txt +6 -4
  84. package/src/mcp/requirements-vision.txt +2 -2
  85. package/src/pantheon/cost-command.ts +403 -102
  86. package/src/pantheon/delegation-enforce.ts +10 -1
  87. package/src/pantheon/model-agents.ts +19 -0
  88. package/src/pantheon/model-command.ts +218 -56
  89. package/src/pantheon/presets.d.mts +0 -8
  90. package/src/pantheon/presets.mjs +5 -32
  91. package/src/pantheon/v2-bounded-read.ts +640 -0
  92. package/src/pantheon/v2-delegation-enforce.ts +214 -0
  93. package/src/pantheon/v2-execute-after.ts +186 -0
  94. package/src/pantheon/v2-model-overrides.ts +275 -0
  95. package/src/pantheon/v2-tools.ts +418 -0
  96. package/src/pantheon/v2-unsupported.d.mts +11 -0
  97. package/src/pantheon/v2-unsupported.mjs +90 -0
  98. package/src/pantheon/v2-vision.ts +622 -0
  99. package/src/pantheon/vision-local.ts +531 -0
  100. package/src/pantheon/vision.ts +1160 -115
  101. package/src/plugin-v2.ts +1158 -219
  102. package/src/plugin.ts +12 -9
  103. package/src/plugins/tui/dist/server.d.ts +1 -2
  104. package/src/plugins/tui/dist/server.d.ts.map +1 -1
  105. package/src/plugins/tui/dist/tui-v2.d.ts +154 -0
  106. package/src/plugins/tui/dist/tui-v2.d.ts.map +1 -0
  107. package/src/plugins/tui/dist/tui-v2.js +659 -0
  108. package/src/plugins/tui/dist/tui-v2.js.map +1 -0
  109. package/src/plugins/tui/dist/tui.d.ts +85 -82
  110. package/src/plugins/tui/dist/tui.d.ts.map +1 -1
  111. package/src/plugins/tui/dist/tui.js +72 -59
  112. package/src/plugins/tui/index-v2.ts +6 -0
  113. package/src/plugins/tui/package-lock.json +5516 -1353
  114. package/src/plugins/tui/package.json +22 -12
  115. package/src/plugins/tui/src/index-v2.tsx +734 -0
  116. package/src/plugins/tui/src/index.tsx +106 -85
  117. package/src/plugins/tui/src/opencode-v2.d.ts +13 -0
  118. package/src/plugins/tui/tsconfig.build.json +5 -0
  119. package/src/plugins/tui/tsconfig.typecheck.json +5 -0
  120. package/src/plugins/tui/tsdown.config.ts +22 -2
  121. package/src/plugins/tui/tui-v2.ts +2 -0
  122. package/src/plugins/tui/tui.ts +3 -0
  123. package/src/routing.yml +11 -21
  124. package/src/skills/README.md +3 -3
  125. package/src/skills/agent-coordination/SKILL.md +7 -2
  126. package/src/skills/artifact-management/SKILL.md +12 -5
  127. package/src/skills/auto-continue/SKILL.md +52 -35
  128. package/src/skills/code-review-checklist/SKILL.md +5 -5
  129. package/src/skills/context-compression/SKILL.md +26 -879
  130. package/src/skills/session-goal/SKILL.md +14 -5
  131. package/src/skills/spec-driven-development/SKILL.md +3 -1
  132. package/src/skills/tdd-with-agents/SKILL.md +18 -10
  133. package/opencode.json +0 -58
package/CHANGELOG.md CHANGED
@@ -18,6 +18,356 @@ 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.11] - 2026-10-15
22
+
23
+ ## 🆕 What's New
24
+
25
+ - **record final Beta 11 scope decisions**
26
+ - **record Setup delivery and final-gate lessons in roadmap**
27
+ - **forbid hook bypass in Iris commit contract**
28
+ - **add installer failure reporting and secret-safe output audit**
29
+ - **detect drift between installer plan and apply**
30
+ - **require explicit --yes authorization before installer apply**
31
+ - **exact installer backup set with restore**
32
+ - **add Beta 11 test-economy requirement to shared instructions**
33
+ - **preview per-file change set in installer dry-run**
34
+ - **reconcile Beta 11 roadmap status with completed phases**
35
+ - **describe pantheon_cost window and aggregation limits**
36
+ - **align lean-flow guidance and cost wording**
37
+ - **add project-scoped V2 model overrides**
38
+ - **align host tool and background contracts**
39
+
40
+ ## 🐞 Fixed
41
+
42
+ - **restore explicit "both" in zeus memory operations instruction**
43
+ - **correct council protocol and persistence bounds**
44
+
45
+ ## [v1.6.0-beta.10] - 2026-10-12
46
+
47
+ ## 🆕 What's New
48
+
49
+ - **Visible plan approval:** Zeus displays Athena's complete plan in the main
50
+ conversation before requesting approval, including for `/pantheon-deepwork`.
51
+ - **OpenCode V2 Vision:** adds `vision_describe` using the live image-capable
52
+ model catalog and OpenCode Zen authentication; relative image paths resolve
53
+ from the active project directory.
54
+
55
+ - **Menos contexto de instruções duplicadas no OpenCode V2:** regras comuns
56
+ entre as instruções globais e de projeto são emitidas uma vez, preservando
57
+ regras exclusivas. Na medição intercalada do beta-10 com OpenCode v2.0.29, o
58
+ proxy de contexto do primeiro request caiu 11,8%; input total e latência de
59
+ parede permanecem inconclusivos.
60
+
61
+ - **Admissão segura de subagents no OpenCode V2:** quando o host registra o
62
+ hook de permissões, Pantheon correlaciona o
63
+ agente, a sessão e o alvo do evento nativo `subagent` com o `source` da
64
+ avaliação de permissão, antes da criação da sessão filha. A matriz permite
65
+ Zeus→Apollo em uma sessão root e nega dispatches fora da matriz ou originados
66
+ em uma sessão filha. A canary isolada passou em 18/18 verificações no
67
+ OpenCode v2.0.29.
68
+
69
+ Evidência de F1 e F4A: `bench/results/f1-di-v229-interleaved-2026-10-14.md` e
70
+ `bench/results/f4a-v229-admission-identity-2026-10-14.md`. O resultado de
71
+ latência total e wall de F1 segue inconclusivo.
72
+
73
+ - **Especialista explícito como root no V2 (F3a):** no cenário one-shot B,
74
+ Talos iniciado explicitamente como agente root produziu o artefato correto
75
+ sem child em 5/5 runs na amostra inicial. Um recheck de integração posterior
76
+ encontrou 4/5; a instrução de Talos passou a exigir que arquivos pedidos
77
+ sejam realmente gravados com a ferramenta nativa. Uma nova coorte
78
+ pré-registrada passou em 5/5, sem children nem chamadas `subagent`. Nessa
79
+ coorte, o proxy de contexto do primeiro request foi 9.675 tokens para Talos
80
+ e 13.009 para Zeus (−25,6%, confirmado contra o spread intra-braço). Input
81
+ total e wall permanecem sem claim de ganho; não há claim de economia
82
+ monetária ou roteamento geral. O primeiro recheck e o follow-up são mantidos
83
+ separadamente em `bench/results/beta10-final-integration-2026-10-15.md` e
84
+ `bench/results/beta10-final-integration-followup-2026-10-15.md`; a evidência
85
+ inicial está em `bench/results/f3a-root-paired-2026-10-14.md`.
86
+
87
+ - **Leitura bounded no OpenCode V2:** adiciona `pantheon_bounded_read` para
88
+ sessões root do Zeus, com aprovação nativa por arquivo, sem grant persistente,
89
+ limites de chamadas/arquivos/linhas/bytes e scanner de segredos fail-closed.
90
+ Validado no OpenCode v2.0.29; detalhes e limitações em
91
+ `bench/results/f3b-v229-bounded-read-2026-10-15.md`.
92
+
93
+ ## [v1.6.0-beta.9] - 2026-10-12
94
+
95
+ <!-- Add new changes here. Running `node scripts/versioning.mjs apply` will
96
+ move this section to a versioned entry and reset the template below. -->
97
+
98
+ ## 🆕 What's New
99
+
100
+ - **Entry point TUI dedicado ao OpenCode V2.** O pacote agora compila e instala
101
+ separadamente os loaders V1/V2, e adiciona `/pantheon-focus` para foco de
102
+ sessão sem depender das goal-tools ausentes no host V2.
103
+
104
+ ## 🐞 Fixed
105
+
106
+ - **Instalação V2:** agentes e slash commands de projeto são instalados nos
107
+ diretórios descobertos pelo host; o TUI seleciona o bundle da geração correta
108
+ e o estado dos componentes só é marcado como instalado após sucesso.
109
+ - **`/pantheon-audit`:** inclui o scanner heurístico no pacote e localiza a cópia
110
+ instalada antes de executar a primeira camada.
111
+ - **`/pantheon-consolidate`:** delega a consolidação ao agente Mnemosyne, dono
112
+ da qualidade do banco de memória.
113
+
114
+ ## ⚠️ Known Issues
115
+
116
+ - **Sidebar V2 na sessão inicial:** a captura do TUI recém-aberto ainda não
117
+ mostra o conteúdo Pantheon antes do primeiro prompt; validar o render inicial
118
+ interativo continua sendo um gate aberto para a beta.
119
+ - **Goal persistente no OpenCode V2:** as goal-tools não fazem parte da
120
+ superfície V2 suportada; `/pantheon-focus` não substitui uma goal-tool
121
+ persistente/removível do host.
122
+
123
+ ## [v1.6.0-beta.8] - 2026-10-11
124
+
125
+ <!-- Add new changes here. Running `node scripts/versioning.mjs apply` will
126
+ move this section to a versioned entry and reset the template below. -->
127
+
128
+ ## 🐞 Fixed
129
+
130
+ - **opencode-v2** — repair session lookup and beta sandbox reuse
131
+ - **scripts** — isolate beta background service port
132
+ ## [v1.6.0-beta.7] - 2026-10-10
133
+
134
+ <!-- Add new changes here. Running `node scripts/versioning.mjs apply` will
135
+ move this section to a versioned entry and reset the template below. -->
136
+
137
+ ## 🆕 What's New
138
+
139
+ - **Permissões MCP nativas por agente no OpenCode V1 e V2.** O instalador
140
+ converte a allowlist `mcp_tools` de cada agente em regras nativas: nega por
141
+ padrão os servidores Pantheon omitidos, libera apenas as ferramentas
142
+ declaradas e preserva MCPs de terceiros. O V2 mantém os servidores
143
+ conectados; as regras limitam quais ferramentas cada agente vê.
144
+ - **Guarda V2 de delegação alinhada ao contrato de permissões.** Os hooks de
145
+ permissão e de sessão aplicam as restrições de sessão somente-leitura e a
146
+ matriz caller→target sem conceder acesso além do configurado pelo host.
147
+ - **Menos chamadas automáticas de memória e compressão.** A busca de contexto
148
+ do Zeus reutiliza o resultado de início de tarefa, e o protocolo de
149
+ compressão deixa de recomendar pipelines automáticos extensos.
150
+ - **Prova de identidade da instalação do sandbox.** O teste global compara a
151
+ versão e arquivos do pacote instalado com este checkout e rejeita referências
152
+ npm antigas nas configurações ativas antes de validar o runtime.
153
+ - O `--prepare` agora gera `start-pantheon.sh` para abrir o TUI interativo com o
154
+ beta instalado e HOME, configuração XDG, projeto e banco de dados isolados do
155
+ sandbox. O launcher fixa a porta do serviço gerenciado em `49376` e falha sem
156
+ parar serviços existentes se a porta dedicada já estiver ocupada.
157
+
158
+ ## 🐞 Fixed
159
+
160
+ - Referências versionadas/alias do pacote Pantheon que sobravam na lista
161
+ `plugins` agora são reconhecidas pelo instalador e substituídas pelo caminho
162
+ do plugin local correto, sem afetar plugins de terceiros com nomes parecidos.
163
+ - A suíte CI foi separada do caminho crítico de instalação/empacotamento para
164
+ reduzir o tempo até o resultado das verificações do pacote.
165
+ - O `run-test.sh` gerado agora define seu timeout do `mcp list` antes do uso
166
+ sob `set -u`; antes, a variável ausente interrompia o teste antes de chamar
167
+ o CLI. A saída do comando também fica disponível quando o gate falha.
168
+
169
+ ## ⚠️ Known Issues
170
+
171
+ - **A delegação real ainda precisa de confirmação nesta beta.** O teste manual
172
+ anterior de `HERMES-PONG` foi negado com
173
+ `Pantheon delegation denied: authoritative caller session is unavailable`;
174
+ a correção de permissões e a instalação isolada precisam ser verificadas no
175
+ TUI OpenCode V2 antes de considerar a delegação validada.
176
+ ## [v1.6.0-beta.6] - 2026-10-05
177
+
178
+ <!-- Add new changes here. Running `node scripts/versioning.mjs apply` will
179
+ move this section to a versioned entry and reset the template below. -->
180
+
181
+ ## 🆕 What's New
182
+
183
+ - **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.
184
+
185
+ ## 🐞 Fixed
186
+
187
+ - **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.
188
+ - **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.
189
+ - **`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.
190
+ ## [v1.6.0-beta.5] - 2026-10-05
191
+
192
+ &lt;!-- Add new changes here. Running `node scripts/versioning.mjs apply` will
193
+ move this section to a versioned entry and reset the template below. --&gt;
194
+
195
+ ## 🆕 What's New
196
+
197
+ - **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**.
198
+ - **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`.
199
+ - **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.
200
+ - **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`.
201
+ - **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.
202
+
203
+ ## 🐞 Fixed
204
+
205
+ - **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**.
206
+ - **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.
207
+
208
+ ## ⚠️ Known Issues
209
+
210
+ - **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`.
211
+ - **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.
212
+ - **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.
213
+
214
+ ## ✅ Closed Issues
215
+
216
+ - **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.
217
+ ## [v1.6.0-beta.4] - 2026-10-03
218
+
219
+ &lt;!-- Add new changes here. Running `node scripts/versioning.mjs apply` will
220
+ move this section to a versioned entry and reset the template below. --&gt;
221
+
222
+ ## 🆕 What's New
223
+
224
+ - **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.
225
+ - **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.
226
+
227
+ ## 🐞 Fixed
228
+
229
+ - `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.
230
+ - `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.
231
+ - `scripts/cost.mjs` duplicava o mesmo bug literal, com o mesmo assert — o fallback continuava morto. `probe-pantheon-cost.mjs` acompanha.
232
+ - O report agora **declara a cobertura temporal** que ele mediu (janela varrida, linha mais antiga), em vez de apresentar totais como se cobrissem meses.
233
+
234
+ ## ⚠️ Known Issues
235
+
236
+ - 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**.
237
+ - 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`.
238
+ - `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.
239
+ ## [v1.6.0-beta.3] - 2026-10-03
240
+
241
+ &lt;!-- Add new changes here. Running `node scripts/versioning.mjs apply` will
242
+ move this section to a versioned entry and reset the template below. --&gt;
243
+
244
+ ## 🆕 What's New
245
+ - **Três ferramentas V2 agora executam de verdade**: `hashline_edit`,
246
+ `pantheon_cost` e `pantheon_model` rodam no host `opencode v2.0.x`. Antes
247
+ eram placeholders que declaravam sucesso sem fazer nada.
248
+ - **Enforcement de sessão read-only no caminho V2**: `apollo` e `gaia` voltam
249
+ a ter escrita bloqueada, com o guard registrado no próprio plugin V2 — sem
250
+ depender de uma ponte que a instalação V2 não monta.
251
+ - **Varredura de segredos de alta confiança no caminho V2**: o único hard block
252
+ de segurança que a V1 tinha, e que estava inerte por viver num plugin que a
253
+ instalação V2 não carrega, passa a rodar.
254
+
255
+ ## 🐞 Fixed
256
+ - **As 6 ferramentas de plugin do V2 falhavam em 100% das chamadas**:
257
+ `hashline_edit`, `pantheon_cost` e `pantheon_model` lançavam
258
+ `Tool result declared output without an output schema` em toda invocação. A
259
+ causa era assimetria local — `draft.add()` não declarava `output` enquanto o
260
+ `execute` resolvia `{ output: string }`. O host exige simetria nos dois
261
+ sentidos: resultado com `output` e nenhuma declaração lança, assim como
262
+ declaração sem `output` no resultado. `output` passou a ser **obrigatório** na
263
+ interface `V2ToolDef`, então o compilador exige a declaração daqui em diante.
264
+ - **A suíte exigia o defeito**: `tests/pantheon/plugin-v2-contract.test.ts`
265
+ afirmava que o resultado carregava `.output` string — literalmente a condição
266
+ de falha, contra um mock que não reproduzia a exigência do host. O teste foi
267
+ reescrito para o invariante de simetria, contra um mock que constrói o
268
+ `outputSchema` a partir de `def.output` como o host faz
269
+ (`output: I.outputSchema ?? {}`), cobrindo as duas direções do bicondicional.
270
+ - **A imposição read-only não existia na superfície V2**: `createEnforcementGuard`
271
+ só era instanciado em `src/plugin.ts`, que o `opencode.json` da release não
272
+ declara — V2 nunca carrega V1. Com `hashline_edit` funcional, uma sessão
273
+ somente-leitura podia escrever arquivos. O guard passou a ser registrado no
274
+ hook `execute.before` do V2, e `pantheon_model` — que escreve
275
+ `active-preset.json` em escopo project e global — foi acrescentado a
276
+ `DEFAULT_BLOCKED_TOOLS`, o que corrige também a V1. `pantheon_cost` ficou de
277
+ fora de propósito: só lê `opencode.db`.
278
+ - **O único hard block de segurança da V1 estava inerte**: o scan de segredos de
279
+ alta confiança vivia em `src/plugins/pantheon-hooks.ts`, um plugin que a
280
+ instalação V2 não carrega — inerte por construção, não por má configuração.
281
+ Passou a rodar dentro do `execute.before` do V2
282
+ (`scripts/hooks/scan-secrets.sh`; exit 2 bloqueia, exit 1 é advisory e só
283
+ registra). O caminho do script foi verificado a partir do tarball instalado,
284
+ não só do repo.
285
+ - **Cinco comentários afirmavam cobertura que não existe** ("wired through the
286
+ V1…"). Corrigidos — é o defeito "anunciado como vivo, morto no caminho", a
287
+ mesma classe do bug original, transferida do tool para o controle de segurança.
288
+
289
+ ## ⚠️ Known Issues
290
+ - **A release entrega 3 ferramentas V2 funcionais, não 6**:
291
+ `pantheon_goal_create`, `pantheon_goal_get` e `pantheon_goal_update` foram
292
+ **removidos** da superfície V2. `GoalLoopDeps` exige `store`, `client` e
293
+ `board`, que não existem no `PluginContext` V2, e a bridge V1 resolve para
294
+ `null` fora da V1. Registrá-las como placeholders não funcionais seria pior
295
+ que a ausência: anunciá-las seria mentira silenciosa. Marcador `goal-tools`
296
+ em `V2_UNSUPPORTED_FEATURES`. **Breaking** para quem usava esses tools no
297
+ host V2 — o contrato V1 permanece disponível para o goal loop.
298
+ - **A matriz de delegação nativa da V1 não é replicada na V2**: o guard V2 cobre
299
+ a lista de ferramentas bloqueadas, mas não a matriz caller→target nem a negação
300
+ de `task` em sessão filha. A matriz precisa de uma hierarquia de sessões
301
+ semeada a partir dos metadados de sessão, e o V2 não expõe esse caminho de
302
+ semeadura — `SessionHierarchyRegistry.isRoot` reporta `true` para sessões
303
+ desconhecidas enquanto não semeada, então semeá-la pela metade negaria todo
304
+ `task()`. O branch é pulado em vez de negado indiscriminadamente. Marcador
305
+ `delegation-matrix`. `task` continua negada em sessão somente-leitura pela
306
+ lista de ferramentas bloqueadas, então a profundidade 2 se sustenta; o que
307
+ não existe é a matriz. Coberto por `experimental.subagent_depth` nesta
308
+ configuração, mas a garantia do plugin não existe.
309
+ - **O log do scan de segredos escreve só em `.pantheon/logs/hooks.log`**: o
310
+ `PluginContext` V2 não expõe `client` nem `directory`, então os canais de log
311
+ estruturado e de toast da V1 não existem nessa superfície. É menos
312
+ observabilidade, não menos bloqueio.
313
+ - **Falha de infraestrutura do scanner é fail-open por decisão**: script ausente
314
+ ou timeout não bloqueiam. `runHook` nunca rejeita e um erro de infraestrutura
315
+ não deve negar chamadas não relacionadas. Ausência do script não bloqueia.
316
+
317
+ ## ✅ Closed Issues
318
+ - **Drift de documentação no `README.pt-BR.md`**: a tabela de contrato de
319
+ runtime e o parágrafo de superfície listavam 6 ferramentas V2 e as 3 de goal,
320
+ que não estão registradas. Corrigido para 3 ferramentas, com a razão da
321
+ ausência e o ponto de imposição read-only.
322
+ - **Cinco comentários de falsa cobertura** sobre a imposição read-only e o scan
323
+ de segredos.
324
+ - **Shim do loader JSON do ajv elevado a bootstrap de módulo**: o patch de
325
+ `Module._extensions['.json']` era aplicado de dentro de `loadAjv()` e ficava
326
+ vivo durante todo o run, podendo vazar entre arquivos de teste e se manifestar
327
+ longe da causa. Agora instala, carrega e restaura em nível de módulo, antes de
328
+ qualquer corpo de teste, com `finally`.
329
+ ## [v1.6.0-beta.2] - 2026-10-02
330
+
331
+ ## 🆕 What's New
332
+ - **`steps` não é mais definido pelo Pantheon**: removido dos 14 agentes em
333
+ `src/agents/`. No OpenCode 2 o campo é opcional e **sem default** — ausente
334
+ significa **sem teto nativo**. O host não impõe teto; o Pantheon estava
335
+ escrevendo um.
336
+ - **Instalador v2 remove `steps` residual**: configs já instalados passam a ter
337
+ o `steps` apagado dos agentes gerenciados. Escopo restrito aos agentes que o
338
+ Pantheon gerencia — um agente definido pelo usuário nunca é tocado. O bloco V1
339
+ singular `agent` é deliberadamente intocado (V1 em retirada).
340
+ - **Substitutos ao teto**: `task(background=true)` para trabalho fora da
341
+ foreground, `experimental.subagent_depth` para aninhamento de subagentes e
342
+ paralelismo entre delegações independentes.
343
+ - **Limpeza**: `max_steps` e `max_compaction_items` removidos de
344
+ `src/routing.yml`. `loadRoutingMaxSteps` nunca teve um único import — 2
345
+ matches no repo (definição e typedef), ambos removidos.
346
+
347
+ ## 🐞 Fixed
348
+ - **`migrateV1toV2` descartava campos gerenciados**: com os blocos `agent` (V1)
349
+ e `agents` (V2) coexistindo — o caso de qualquer config já instalado — o
350
+ spread raso fazia um substituir o outro por inteiro. Na ordem de chaves do
351
+ `opencode.json` real, o lado perdedor era o do usuário. Agora **mescla**: a
352
+ base é o bloco V2, os campos gerenciados do V1 sobrescrevem, e os campos do
353
+ usuário são preservados. Mesma semântica já usada em `install/opencode.mjs`.
354
+ - **`docs/platforms/README.md` tinha tabela de step limits errada**: 14 linhas
355
+ listando limites por agente, **nenhum valor batendo** com `src/agents/`.
356
+ Tabela removida e a seção reescrita.
357
+
358
+ ## ⚠️ Known Issues
359
+ - **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`.
360
+ - **Migração — rode o init uma vez**: `npx pantheon-opencode init
361
+ --opencode-version=v2` **uma única vez** limpa o `steps` residual. Sem isso o
362
+ config instalado continua carregando o teto antigo.
363
+ - **O `.md` de agente instalado é sobrescrito no próximo sync**: editar
364
+ `~/.config/opencode/agents/*.md` esperando persistência **não funciona**.
365
+ Comportamento **pré-existente**, não é regressão desta mudança — mas agora
366
+ está documentado para não ser reportado como uma.
367
+ - **`steps` definido à mão num agente gerenciado é removido a cada install v2**:
368
+ o instalador não distingue um valor que ele escreveu de um valor que você
369
+ escreveu (mesma chave, mesmo valor). Workaround: definir no frontmatter do
370
+ agente — e lembrar que ele **também** é sobrescrito no próximo sync.
21
371
  ## [v1.6.0-beta.1] - 2026-09-30
22
372
 
23
373
  <!-- Add new changes here. Running `node scripts/versioning.mjs apply` will