Quando propor alterações em artefato existente, retorne apenas o delta - o bloco que mudou. Jamais reescreva o artefato inteiro. Isso preserva contexto, reduz consumo de tokens e evita sobrescrever acidentalmente partes não alteradas.
Esta skill governa dois modos de operação, dependendo de onde o artefato vive:
Quando o arquivo está disponível no filesystem (/home/claude/, /mnt/user-data/), usar a ferramenta nativa str_replace:
str_replace(
path: "caminho/do/arquivo",
old_str: "trecho exato a substituir",
new_str: "trecho novo"
)
Neste modo, não formatar a entrega como bloco visual - a ferramenta já é cirúrgica por natureza. Apenas explicar brevemente o que mudou e por quê.
Quando o artefato não está no container (repositório local do usuário, workflow n8n, Supabase, Google Apps Script, arquivo que o usuário vai copiar manualmente), usar o formato visual padronizado descrito abaixo.
📄 Artefato: `caminho/do/arquivo.ext` ou `nome do workflow / nó`
🔧 Bloco: `nomeDaFuncao` | `seção X` | `nó "Nome do Nó"` | `cláusula WHERE`
✏️ Ação: substituir | adicionar após [referência] | remover
```[linguagem]
// ... código/conteúdo existente acima ...
[BLOCO ALTERADO AQUI]
// ... código/conteúdo existente abaixo ...
### Regras do formato
- **Sempre** indicar artefato, bloco e ação - sem esses três, o usuário não sabe onde encaixar
- **Marcadores de continuidade** representam o conteúdo inalterado:
- JS/TS: `// ... código existente ...`
- Python: `# ... restante da classe ...`
- SQL: `-- ... demais colunas inalteradas ...`
- HTML/CSS: `<!-- ... seções inalteradas ... -->`
- JSON: `"...": "/* demais campos inalterados */"`
- Markdown: `<!-- ... restante do documento ... -->`
- **Múltiplas alterações no mesmo artefato**: um bloco por ponto de edição, na ordem em que aparecem no artefato original
- **Múltiplos artefatos**: separar com cabeçalho `📄 Artefato:` - nunca misturar
---
## Edição Iterativa de Documentos
Em fluxos de construção por blocos (petições, pareceres, contratos, skills, workflows), o padrão cirúrgico se aplica com força especial:
### Contexto típico
O usuário e o Claude estão construindo um artefato em múltiplas rodadas. A cada rodada, o usuário pede ajustes em blocos específicos do que já foi gerado. O artefato pode ser:
- Peça jurídica em construção (fundamentação já pronta, agora ajustar os pedidos)
- Skill sendo refinada (trigger já definido, agora expandir as regras de redação)
- Workflow n8n sendo iterado (nó de trigger pronto, agora corrigir o Code Tool)
- HTML/CSS de documento timbrado (cabeçalho pronto, agora ajustar o footer)
- Script Python ou Apps Script em desenvolvimento
### Regras para edição iterativa
1. **Nunca regenerar o artefato completo** quando o pedido se refere a um bloco específico
2. **Referenciar o bloco pelo identificador natural**: nome da seção, nome da função, número do slide, nome do nó n8n, seletor CSS, número da cláusula contratual
3. **Preservar o que já foi aprovado**: se o usuário aprovou a fundamentação e agora pede ajuste nos pedidos, a fundamentação não aparece na resposta
4. **Entregar o bloco editado completo**: não entregar "meia função" - o bloco inteiro que mudou, com marcadores de continuidade antes e depois
5. **Quando houver dúvida sobre o escopo**: perguntar "você quer que eu ajuste só [bloco X] ou reescreva a seção inteira?"
---
## Regras Específicas por Tipo de Artefato
### Código (JS, TS, Python, Apps Script, SQL)
- Retornar a função/método/bloco inteiro que mudou, não apenas a linha
- Se a alteração impacta imports, mostrar o import novo separadamente como bloco adicional
- Nunca reescrever boilerplate (setup Express, setup Next.js, etc.) que não mudou
### Workflows n8n (JSON)
- Identificar o nó pelo campo `"name"` - retornar apenas o objeto do nó alterado
- Se a alteração é no `jsCode` de um Code Tool, retornar apenas o nó com o `jsCode` atualizado
- Se a alteração é em `connections`, retornar apenas o bloco de connections afetado
- **Regra crítica**: nunca alterar o `webhookId` do MCP Server Trigger (`0199517e-f508-4cc9-8dd4-9532ffa42e6c`) em edições parciais - isso quebra a URL de conexão Claude ↔ n8n
- Para alterações que afetam nó + connection, entregar dois blocos separados e identificados
### HTML/CSS (documentos timbrados, landing pages, artefatos visuais)
- Identificar o bloco pelo seletor CSS ou pelo elemento semântico (`<header>`, `<section class="pedidos">`, `<footer>`)
- Se a alteração é só CSS, retornar apenas o bloco `<style>` ou o seletor específico
- Nunca reescrever o HTML inteiro quando só o CSS mudou, e vice-versa
### Skills (SKILL.md)
- Identificar a seção pelo heading Markdown (`## Regras de Redação`, `## Trigger`, etc.)
- Se o trigger (description no frontmatter) mudou, retornar apenas o bloco `---` do frontmatter
- Se uma seção interna mudou, retornar apenas aquela seção com heading + conteúdo
### Documentos jurídicos em construção
- Identificar o bloco pelo nome estratégico: "endereçamento", "qualificação", "fundamentação - tese X", "pedidos", "fechamento"
- Respeitar a construção em blocos do padrão do escritório: nunca fundir blocos que o usuário separou
- Se o ajuste é em um parágrafo específico dentro de uma seção, citar o parágrafo anterior como âncora de referência
---
## O que NÃO fazer
| Proibido | Correto |
|---|---|
| Colar o artefato inteiro com a linha alterada no meio | Colar só o bloco alterado |
| Reescrever imports/headers/boilerplate que não mudaram | Usar marcador de continuidade |
| Misturar blocos de artefatos diferentes sem separação | Separar por `📄 Artefato:` |
| Omitir onde a alteração se encaixa | Sempre informar artefato + bloco + ação |
| Regenerar seções aprovadas de um documento iterativo | Entregar só o bloco que o pedido menciona |
| Tocar no `webhookId` do MCP Trigger em edições n8n | Preservar IDs críticos como regra inviolável |
| Entregar "meia função" (só as linhas que mudaram sem contexto) | Entregar o bloco/função inteiro que mudou |
---
## Quando é aceitável entregar o artefato inteiro
Apenas se:
- O usuário **pedir explicitamente** ("me manda o arquivo completo", "reescreve tudo", "consolida tudo")
- O artefato tiver menos de ~30 linhas e a alteração impactar mais de 70% dele
- For a **primeira versão** do artefato (criação, não edição) - neste caso a skill geradora específica tem prioridade
---
## Exemplo Prático - Edição Iterativa de Petição
**Contexto:** Fundamentação já entregue e aprovada. Usuário pede: "Ajusta os pedidos, preciso incluir pedido de tutela de urgência."
**Errado:**
[Reescreve a petição inteira - 4 páginas - para adicionar um pedido]
**Correto:**
📄 Artefato: Petição - Ação Anulatória de Débito Fiscal 🔧 Bloco: Seção de Pedidos (após “DOS PEDIDOS”) ✏️ Ação: substituir
Diante do exposto, requer a Vossa Excelência:
a) a concessão de tutela de urgência, inaudita altera parte, para suspender a exigibilidade do crédito tributário objeto do Auto de Infração nº XX/2025, nos termos do artigo 300 do CPC c/c artigo 151, V, do CTN, ante o fundado risco de inscrição em dívida ativa e consequente restrição cadastral;
b) a citação da parte ré para, querendo, contestar a presente no prazo legal;
c) no mérito, a procedência dos pedidos para declarar a nulidade do Auto de Infração nº XX/2025, com o consequente cancelamento do crédito tributário no valor de R$ 150.000,00 (cento e cinquenta mil reais);
d) a condenação da parte ré ao pagamento de honorários advocatícios e custas processuais.
---
## Exemplo Prático - Edição de Nó n8n
**Contexto:** Workflow MCP com 10 Code Tools. Usuário pede: "Corrige o Code Tool Create - o parse do JSON está falhando quando recebe workflow_json aninhado."
**Correto:**
📄 Artefato: Workflow MCP Server (ID: WP146hNfuetOQ1kW)
🔧 Nó: “Code Tool Create” (id: da4d888e-…)
✏️ Ação: substituir campo jsCode
```javascript
const API_KEY = '...';
const BASE = 'https://n8n-production-a84a.up.railway.app';
let workflowData;
try {
const parsed = JSON.parse(query);
// FIX: suporta wrapper workflow_json e também objeto direto
workflowData = parsed.workflow_json || parsed;
// Validação mínima
if (!workflowData.name && !workflowData.nodes) {
return JSON.stringify({ error: true, message: 'Payload deve conter name e/ou nodes' });
}
} catch (e) {
return JSON.stringify({ error: true, message: 'JSON invalido: ' + e.message });
}
// ... restante do fluxo de criação inalterado ...