{"id":1595,"date":"2026-09-14T09:39:15","date_gmt":"2026-09-14T12:39:15","guid":{"rendered":"https:\/\/www.linuxpro.com.br\/?p=1595"},"modified":"2026-09-14T09:45:42","modified_gmt":"2026-09-14T12:45:42","slug":"phpvirtualbox-em-go-parte-2-migracao-com-ia-e-openspec","status":"publish","type":"post","link":"https:\/\/www.linuxpro.com.br\/es\/2026\/09\/phpvirtualbox-em-go-parte-2-migracao-com-ia-e-openspec\/","title":{"rendered":"phpVirtualBox en Go \u2014 parte 2: migraci\u00f3n con IA y OpenSpec"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"\/wp-content\/uploads\/2026\/09\/phpvirtualbox-go-echo-vue-v1.webp\" alt=\"Mascote LinuxPro e cachorro caramelo cyborg em laborat\u00f3rio de virtualiza\u00e7\u00e3o, com PHP, Go e Vue nos monitores.\" width=\"1486\" height=\"856\" \/><\/p>\n<p><strong>Antes de come\u00e7ar:<\/strong> conhe\u00e7a o projeto original no artigo <a href=\"\/2026\/09\/phpvirtualbox-gerencie-o-virtualbox-pelo-navegador\/\">phpVirtualBox: gerencie o VirtualBox pelo navegador<\/a>.<\/p>\n<p><strong>Nesta s\u00e9rie:<\/strong> <a href=\"\/2026\/09\/phpvirtualbox-em-go-parte-1-echo-vue-e-binario-unico\/\">Parte 1: phpVirtualBox, Echo e Vue<\/a> \u00b7 <a href=\"\/2026\/09\/phpvirtualbox-em-go-parte-2-migracao-com-ia-e-openspec\/\">Parte 2: IA e OpenSpec<\/a> \u00b7 <a href=\"\/2026\/09\/phpvirtualbox-em-go-parte-3-roteiro-de-implementacao-e-testes\/\">Parte 3: implementa\u00e7\u00e3o e testes<\/a><\/p>\n<p><strong>S\u00e9rie phpVirtualBox em Go \u2014 parte 2 de 3.<\/strong> Uma migra\u00e7\u00e3o confi\u00e1vel come\u00e7a com contratos e evid\u00eancias, n\u00e3o com uma convers\u00e3o autom\u00e1tica de arquivos. Nesta parte, vamos organizar a reimplementa\u00e7\u00e3o proposta em Go, Echo e Vue usando IA e OpenSpec.<\/p>\n<h2>Como migrar com IA: comportamento primeiro, c\u00f3digo depois<\/h2>\n<p>A estrat\u00e9gia que proponho \u00e9 incremental. Fixe um commit do projeto de refer\u00eancia, registre o ambiente de laborat\u00f3rio e pe\u00e7a \u00e0 IA um mapa das funcionalidades. Cada conclus\u00e3o deve apontar para arquivos ou documenta\u00e7\u00e3o que a sustentem. Onde n\u00e3o houver evid\u00eancia, a resposta correta \u00e9 uma d\u00favida a investigar, n\u00e3o uma implementa\u00e7\u00e3o inventada.<\/p>\n<p>Um prompt inicial \u00fatil seria:<\/p>\n<pre><code class=\"language-text\">Analise o phpVirtualBox sem modificar arquivos.\n\nMapeie telas, endpoints, autentica\u00e7\u00e3o, integra\u00e7\u00e3o SOAP\n e opera\u00e7\u00f5es que alteram m\u00e1quinas virtuais.\n\nPara cada comportamento, indique os arquivos de refer\u00eancia.\nSepare fatos verificados, d\u00favidas e propostas de melhoria.\n\nProponha um MVP somente leitura em Go + Echo + Vue.\nN\u00e3o implemente c\u00f3digo e n\u00e3o execute a\u00e7\u00f5es em VMs.<\/code><\/pre>\n<p>O resultado esperado \u00e9 uma matriz de funcionalidades: o que existe, o que ser\u00e1 preservado, o que ficar\u00e1 para depois e quais testes demonstrar\u00e3o a compatibilidade. Isso evita a armadilha de converter arquivos PHP em arquivos Go sem entender as regras que eles implementam.<\/p>\n<p>N\u00e3o \u00e9 obrigat\u00f3rio preservar cada endpoint interno da interface antiga. \u00c9 obrigat\u00f3rio decidir quais comportamentos e integra\u00e7\u00f5es precisam permanecer compat\u00edveis. Essa decis\u00e3o deve aparecer na especifica\u00e7\u00e3o antes de virar c\u00f3digo.<\/p>\n<h2>OpenSpec: transformar a migra\u00e7\u00e3o em mudan\u00e7as revis\u00e1veis<\/h2>\n<p>O OpenSpec organiza o trabalho por mudan\u00e7as com proposta, especifica\u00e7\u00f5es, desenho t\u00e9cnico e tarefas. A documenta\u00e7\u00e3o atual exige Node.js 20.19 ou superior para a ferramenta. Em um reposit\u00f3rio separado para o novo painel, a prepara\u00e7\u00e3o \u00e9:<\/p>\n<pre><code class=\"language-bash\">npm install -g @fission-ai\/openspec@latest\nopenspec init<\/code><\/pre>\n<p>Selecione a integra\u00e7\u00e3o com seu assistente durante a inicializa\u00e7\u00e3o. O fluxo documentado usa <code>\/opsx:explore<\/code>, <code>\/opsx:propose<\/code>, <code>\/opsx:apply<\/code> e <code>\/opsx:archive<\/code>; a grafia dos comandos pode variar conforme o assistente. Eles s\u00e3o a\u00e7\u00f5es do assistente, n\u00e3o comandos Bash. <a href=\"https:\/\/github.com\/Fission-AI\/OpenSpec\">Instala\u00e7\u00e3o e fluxo oficiais do OpenSpec<\/a>.<\/p>\n<p>A primeira mudan\u00e7a poderia ter esta organiza\u00e7\u00e3o:<\/p>\n<pre><code class=\"language-text\">openspec\/changes\/painel-vms-somente-leitura\/\n\u251c\u2500\u2500 proposal.md\n\u251c\u2500\u2500 design.md\n\u251c\u2500\u2500 specs\/\n\u2502   \u2514\u2500\u2500 inventario-vms\/\n\u2502       \u2514\u2500\u2500 spec.md\n\u2514\u2500\u2500 tasks.md<\/code><\/pre>\n<p>Na proposta, explique o objetivo e o que n\u00e3o ser\u00e1 feito. No desenho t\u00e9cnico, registre como a API conversa com o VirtualBox e como configura\u00e7\u00f5es e segredos ser\u00e3o tratados. Nas especifica\u00e7\u00f5es, descreva os resultados observ\u00e1veis. Nas tarefas, coloque etapas pequenas que possam ser implementadas e verificadas.<\/p>\n<h2>Exemplo de especifica\u00e7\u00e3o para o primeiro MVP<\/h2>\n<p>Eu come\u00e7aria com um painel autenticado, capaz de listar m\u00e1quinas sem modificar o ambiente. O exemplo abaixo \u00e9 uma especifica\u00e7\u00e3o proposta para o novo projeto, n\u00e3o uma funcionalidade j\u00e1 implementada:<\/p>\n<pre><code class=\"language-markdown\">## ADDED Requirements\n\n### Requirement: Invent\u00e1rio protegido de m\u00e1quinas virtuais\nThe system SHALL listar apenas m\u00e1quinas autorizadas\npara o usu\u00e1rio autenticado, sem alterar seu estado.\n\n#### Scenario: Consulta autorizada\n- **WHEN** um usu\u00e1rio autorizado solicita o invent\u00e1rio\n- **THEN** a API retorna UUID, nome e estado das m\u00e1quinas\n- **AND** nenhuma opera\u00e7\u00e3o de escrita \u00e9 executada\n\n#### Scenario: Requisi\u00e7\u00e3o sem autentica\u00e7\u00e3o\n- **WHEN** uma requisi\u00e7\u00e3o an\u00f4nima consulta o invent\u00e1rio\n- **THEN** a API responde HTTP 401\n- **AND** n\u00e3o divulga dados das m\u00e1quinas\n\n#### Scenario: Usu\u00e1rio sem permiss\u00e3o\n- **WHEN** um usu\u00e1rio autenticado n\u00e3o possui acesso ao invent\u00e1rio\n- **THEN** a API responde HTTP 403\n\n#### Scenario: Timeout do servi\u00e7o de virtualiza\u00e7\u00e3o\n- **WHEN** a consulta excede o prazo configurado\n- **THEN** a API responde HTTP 504 com erro estruturado\n- **AND** a interface permite uma nova tentativa manual<\/code><\/pre>\n<p>Observe que cada cen\u00e1rio exige uma evid\u00eancia: resposta HTTP, campos retornados, aus\u00eancia de escrita ou comportamento da interface. \u201cFunciona como o PHP\u201d \u00e9 amplo demais para ser um crit\u00e9rio de aceita\u00e7\u00e3o \u00fatil.<\/p>\n<h2>Exemplo de tasks.md: tarefas que a IA consegue executar<\/h2>\n<pre><code class=\"language-markdown\">## 1. Refer\u00eancia e contrato\n- [ ] Registrar o commit PHP usado como refer\u00eancia.\n- [ ] Documentar o contrato GET \/api\/v1\/vms e seus erros.\n- [ ] Criar fixtures sanitizadas para os cen\u00e1rios aceitos.\n\n## 2. Backend\n- [ ] Criar a estrutura Echo com configura\u00e7\u00e3o externa.\n- [ ] Implementar autentica\u00e7\u00e3o e autoriza\u00e7\u00e3o do invent\u00e1rio.\n- [ ] Implementar a consulta SOAP com timeout configur\u00e1vel.\n- [ ] Garantir libera\u00e7\u00e3o das sess\u00f5es utilizadas, inclusive em erros.\n- [ ] Testar host indispon\u00edvel, acesso negado e resposta inv\u00e1lida.\n\n## 3. Frontend e distribui\u00e7\u00e3o\n- [ ] Exibir m\u00e1quinas, lista vazia, carregamento e erros no Vue.\n- [ ] Incorporar os arquivos compilados com go:embed.\n- [ ] Executar o bin\u00e1rio fora da \u00e1rvore do c\u00f3digo-fonte.\n\n## 4. Aceita\u00e7\u00e3o\n- [ ] Comparar o invent\u00e1rio com o host real de laborat\u00f3rio.\n- [ ] Comprovar que a consulta n\u00e3o dispara opera\u00e7\u00f5es de escrita.\n- [ ] Registrar resultados dos testes e limita\u00e7\u00f5es conhecidas.\n- [ ] Revisar a mudan\u00e7a antes de arquivar a especifica\u00e7\u00e3o.<\/code><\/pre>\n<p>Para trabalhar com a IA, pe\u00e7a apenas a pr\u00f3xima tarefa ou um conjunto pequeno de tarefas dependentes. Exija um resumo dos arquivos alterados, testes executados e limita\u00e7\u00f5es. A ferramenta n\u00e3o deve marcar como conclu\u00edda uma integra\u00e7\u00e3o validada somente com mocks se o crit\u00e9rio exige um host real.<\/p>\n<p>O OpenSpec organiza o processo, mas n\u00e3o substitui revis\u00e3o, testes ou conhecimento do dom\u00ednio. Uma caixa marcada n\u00e3o \u00e9 evid\u00eancia de funcionamento.<\/p>\n<h2>Como dividir o trabalho sem perder o controle<\/h2>\n<p>Uma mudan\u00e7a deve entregar um comportamento observ\u00e1vel. Em vez de uma tarefa chamada \u201cmigrar o backend\u201d, separe autentica\u00e7\u00e3o, invent\u00e1rio, opera\u00e7\u00f5es e persist\u00eancia. Dentro de cada mudan\u00e7a, registre depend\u00eancias: a tela de invent\u00e1rio depende de um contrato, mas pode ser desenvolvida com um servidor simulado enquanto o adaptador \u00e9 implementado.<\/p>\n<p>Se utilizar v\u00e1rios agentes, atribua arquivos ou m\u00f3dulos distintos e mantenha um respons\u00e1vel pelo contrato compartilhado. N\u00e3o deixe cada agente inventar seu pr\u00f3prio formato de erro ou representa\u00e7\u00e3o de VM. Mudan\u00e7as no contrato devem voltar \u00e0 especifica\u00e7\u00e3o e aos testes, n\u00e3o surgir silenciosamente durante a implementa\u00e7\u00e3o.<\/p>\n<p>Um prompt para a fase de execu\u00e7\u00e3o:<\/p>\n<pre><code class=\"language-text\">Leia a proposta, o desenho t\u00e9cnico e os cen\u00e1rios desta mudan\u00e7a.\nImplemente somente a pr\u00f3xima tarefa pendente autorizada.\nN\u00e3o altere o contrato para contornar um teste que falhou.\nN\u00e3o execute opera\u00e7\u00f5es em infraestrutura de produ\u00e7\u00e3o.\nAdicione testes e registre os comandos e seus resultados.\nSe faltar uma decis\u00e3o, explique o bloqueio antes de invent\u00e1-la.\nS\u00f3 marque a tarefa conclu\u00edda com evid\u00eancia de aceita\u00e7\u00e3o.<\/code><\/pre>\n<h2>O que significa terminar uma mudan\u00e7a<\/h2>\n<p>A revis\u00e3o precisa verificar c\u00f3digo, testes e documenta\u00e7\u00e3o em conjunto. Os cen\u00e1rios foram implementados? Os erros continuam estruturados? Algum segredo apareceu em fixtures? O comportamento foi validado no laborat\u00f3rio quando exigido? Um teste simulado n\u00e3o deve ser apresentado como integra\u00e7\u00e3o real com o VirtualBox.<\/p>\n<p>Arquive a mudan\u00e7a somente depois da revis\u00e3o e registre as limita\u00e7\u00f5es restantes. Na pr\u00f3xima parte, veremos como esse planejamento se transforma em uma sequ\u00eancia de entregas: do primeiro execut\u00e1vel com Vue incorporado at\u00e9 opera\u00e7\u00f5es de escrita, recupera\u00e7\u00e3o e implanta\u00e7\u00e3o.<\/p>\n<p><strong>Nesta s\u00e9rie:<\/strong> <a href=\"\/2026\/09\/phpvirtualbox-em-go-parte-1-echo-vue-e-binario-unico\/\">Parte 1: phpVirtualBox, Echo e Vue<\/a> \u00b7 <a href=\"\/2026\/09\/phpvirtualbox-em-go-parte-2-migracao-com-ia-e-openspec\/\">Parte 2: IA e OpenSpec<\/a> \u00b7 <a href=\"\/2026\/09\/phpvirtualbox-em-go-parte-3-roteiro-de-implementacao-e-testes\/\">Parte 3: implementa\u00e7\u00e3o e testes<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>C\u00f3mo planificar la migraci\u00f3n de phpVirtualBox con IA y OpenSpec: requisitos, escenarios de aceptaci\u00f3n y tareas verificables.<\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[45,2,120],"tags":[31],"class_list":["post-1595","post","type-post","status-publish","format-standard","hentry","category-desenv","category-linux","category-servidores","tag-golang"],"_links":{"self":[{"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/posts\/1595","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/comments?post=1595"}],"version-history":[{"count":3,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/posts\/1595\/revisions"}],"predecessor-version":[{"id":1610,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/posts\/1595\/revisions\/1610"}],"wp:attachment":[{"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/media?parent=1595"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/categories?post=1595"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.linuxpro.com.br\/es\/wp-json\/wp\/v2\/tags?post=1595"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}