remove-ai-tells · diff
git:20261030.318ea9c to git:20261030.6b6d663
34 added, 28 removed. Audit A to A.
---
name: remove-ai-tells
- description: Tira de um texto os tells de escrita gerada por IA (antítese em série, frase de efeito, travessão, a mesma coisa com três nomes) a partir dos achados de um agente revisor separado e devolve o texto limpo com o antes e depois de cada trecho. Use quando a pessoa disser "tira os AI tells desse texto", "isso tá com cara de IA?", "revisa os tells antes de eu mandar", "limpa a cara de IA disso" ou rodar /pm-chief-of-staff:remove-ai-tells. Não use pra escrever texto do zero, revisar gramática e ortografia ou ajustar o tom a um destinatário, que são pedidos diretos ao agente.
+ description: Removes from a text the tells of AI-generated writing (antithesis in series, punchlines, em dashes, the same thing under three names) based on the findings of a separate reviewer agent, and returns the clean text with the before and after of each excerpt. Use when the person says "remove the AI tells from this text", "does this sound like AI?", "check the tells before I send this", "clean up the AI feel of this", "tira os AI tells desse texto", "isso tá com cara de IA?", "revisa os tells antes de eu mandar", "limpa a cara de IA disso" or runs /pm-chief-of-staff:remove-ai-tells. Do not use to write a text from scratch, review grammar and spelling or adjust the tone to a recipient, which are direct requests to the agent.
---
# Remove AI tells
- Um tell isolado passa despercebido. A mesma forma repetida no texto denuncia a escrita gerada. Quem escreveu ou vai reescrever o texto enxerga mal os próprios tells, por isso a leitura sai do `ai-tells-reviewer`, o revisor do plugin, que lê em contexto separado (agente nomeado no Claude Code, subagente novo no Codex).
+ One isolated tell goes unnoticed. The same form repeated across the text gives the generated writing away. Whoever wrote or is about to rewrite the text sees their own tells poorly, so the reading comes from `ai-tells-reviewer`, the plugin's reviewer, which reads in a separate context (named agent in Claude Code, new subagent in Codex).
- ## Fluxo
+ Talk to the person in their language (the one the folder's instruction file sets; without it, the one they write in). The text keeps its own language: the scan below covers English and Portuguese, and the reviewer reads either.
- 1. Pegue o texto colado, o caminho de arquivo ou o último texto que você escreveu na sessão. Sem texto claro, pergunte qual.
- 2. Grave a cópia do texto em `rascunho-tells.md` na raiz da pasta da pessoa com a ferramenta de escrita de arquivo, porque o modo que aceita edição libera essa ferramenta e um comando de shell pode parar num pedido de aprovação. Arquivo que já existe com esse nome nunca é substituído nem apagado, inclusive quando é a própria origem, porque ele é da pessoa. Nesse caso use o próximo nome livre (`rascunho-tells-2.md`, `rascunho-tells-3.md` e assim por diante), e os passos seguintes chamam de rascunho o arquivo criado nesta execução. O rascunho mantém cada quebra de linha. Lista, tabela, título e bloco de código ficam intactos porque o trecho aprovado volta pro arquivo de origem por correspondência exata. Varredura, revisor e reescrita trabalham no rascunho. Ele fica fora de `.claude/`, que pede permissão de escrita até no modo que aceita edição. Antes de gravar, avise em 1 frase que criar o arquivo na raiz pode pedir permissão de escrita. Negada a permissão, pare e diga à pessoa que o revisor lê o texto de um arquivo e sem o rascunho ele não roda.
- 3. Varra o rascunho com as três regex abaixo, já que contagem a olho erra. Use a ferramenta Grep se ela estiver na lista de ferramentas da sessão. Sem ela, use `rg -P` no shell (o Codex põe o `rg` no PATH; o modo multilinha é `-U`) e, sem `rg`, `perl -CSD -Mutf8`: linha a linha com `-ne 'print "$.: $_" if /REGEX/i'`, e o arquivo inteiro com `-0777 -ne 'print "$&\n" while /REGEX/g'` pra regex multilinha. Nunca `grep -P`: o grep do macOS não tem `-P`, e o `grep` sem ele devolve vazio e sem erro nas regex de antítese e de dois-pontos. A busca devolve candidatos. Descarte os que caem em bloco de código, código inline, URL, horário (o dois-pontos de URL e de hora não conta) ou linha de alinhamento de tabela (`|:---|---:|`).
- - Travessão, bife e aspas curvas pela regex `[\x{2014}\x{2013}\x{201C}\x{201D}\x{2018}\x{2019}]`. O code point evita a confusão entre travessão, bife e hífen.
- - Antítese pela regex `(não é [a-zà-ú]|, não [a-zà-ú]|não só |não apenas |mais do que )`. Use `-i` pra pegar a maiúscula do início da frase. Ela acha a antítese nua e também o comparativo legítimo, que o revisor descarta. A antítese disfarçada fica com ele.
- - Dois-pontos e ponto e vírgula pela regex `[:;](?:[^:;\n]|\n[^\n:;])*[:;]` com `multiline`. Ela acha cada parágrafo (linhas seguidas sem linha em branco) com dois ou mais desses sinais somados e devolve dele o trecho entre o primeiro e o último sinal.
- 4. Chame o revisor com o caminho do rascunho e o de `.claude/skills/_shared/tells.md` da pasta da pessoa, se existir. Mande os caminhos sem a sua leitura do texto, que enviesaria a dele. Ele devolve os achados e a contagem de ocorrências por forma (uma linha com dois travessões soma dois).
+ ## Flow
- No Claude Code, o revisor é o `ai-tells-reviewer` (`pm-chief-of-staff:ai-tells-reviewer` na lista de agentes).
+ 1. Take the pasted text, the file path or the last text you wrote in the session. Without a clear text, ask which one.
+ 2. Save a copy of the text to `tells-draft.md` at the root of the person's folder with the file-writing tool, because the mode that accepts edits allows that tool and a shell command can stop at an approval prompt. A file that already exists with that name is never replaced or deleted, including when it is the source itself, because it belongs to the person. In that case use the next free name (`tells-draft-2.md`, `tells-draft-3.md` and so on), and the following steps call draft the file created in this run. A `rascunho-tells.md` left by 0.7.0 is also theirs: it stays untouched, and this run never reuses or deletes it. The draft keeps every line break. Lists, tables, headings and code blocks stay intact because the approved excerpt goes back to the source file by exact match. Scan, reviewer and rewrite work on the draft. It stays outside `.claude/`, which asks for write permission even in the mode that accepts edits. Before saving, say in 1 sentence that creating the file at the root may ask for write permission. If permission is denied, stop and tell the person that the reviewer reads the text from a file and without the draft it does not run.
+ 3. Scan the draft with the three regexes below, since counting by eye gets it wrong. Use the Grep tool if it is in the session's tool list. Without it, use `rg -P` in the shell (Codex puts `rg` on the PATH; multiline mode is `-U`) and, without `rg`, `perl -CSD -Mutf8`: line by line with `-ne 'print "$.: $_" if /REGEX/i'`, and the whole file with `-0777 -ne 'print "$&\n" while /REGEX/g'` for a multiline regex. Never `grep -P`: the macOS grep has no `-P`, and `grep` without it returns empty and without error on the antithesis and colon regexes. The search returns candidates. Discard those that fall in a code block, inline code, URL, time of day (the colon of a URL or a time does not count) or table alignment row (`|:---|---:|`).
+ - Em dash, en dash and curly quotes with the regex `[\x{2014}\x{2013}\x{201C}\x{201D}\x{2018}\x{2019}]`. The code point avoids confusing em dash, en dash and hyphen.
+ - Antithesis with the regex `(não é [a-zà-ú]|, não [a-zà-ú]|não só |não apenas |mais do que |isn't [a-z]|is not [a-z]|, not [a-z]|not only |not just |more than )`. Use `-i` to catch the capital at the start of a sentence. It finds the bare antithesis in Portuguese and in English and also the legitimate comparative (`mais do que`, `more than`, `is not`), which the reviewer discards. The disguised antithesis stays with the reviewer.
+ - Colons and semicolons with the regex `[:;](?:[^:;\n]|\n[^\n:;])*[:;]` in `multiline`. It finds each paragraph (consecutive lines without a blank line) with two or more of these signs added up and returns from it the excerpt between the first and the last sign.
+ 4. Call the reviewer with the path of the draft and the path of `.claude/skills/_shared/tells.md` in the person's folder, if it exists. Send the paths without your reading of the text, which would bias the reviewer's. It returns the findings and the count of occurrences per form (a line with two em dashes counts two).
- No Codex, que não registra o agente do plugin, abra um subagente novo, sem cópia do histórico desta conversa e com o modelo da sessão. A instrução dele é o corpo de `<raiz do plugin>/agents/ai-tells-reviewer.md` abaixo do frontmatter, os dois caminhos e a ordem explícita de só ler: não editar, criar nem apagar arquivo, e não rodar comando que escreva. O `tools:` do frontmatter só restringe no Claude, por isso a ordem vai no despacho. A raiz do plugin é `${CLAUDE_PLUGIN_ROOT}`; se a variável não resolver, a pasta dois níveis acima deste SKILL.md; só sem ela, a pasta do plugin `pm-chief-of-staff` no cache de plugins do Codex. Sem subagente na sessão (recurso desligado ou negado), diga à pessoa que a leitura independente não roda aqui. Ela escolhe parar ou seguir só com a varredura do passo 3, e a entrega declara que nenhum revisor separado leu o texto. A leitura do revisor nunca é feita nesta sessão no lugar dele.
+ In Claude Code, the reviewer is `ai-tells-reviewer` (`pm-chief-of-staff:ai-tells-reviewer` in the agent list).
- No Claude Code, quem instalou ou atualizou o plugin com a sessão aberta pode não ver o revisor na lista de agentes. Nesse caso, sugira `/reload-plugins` e, se o revisor seguir fora da lista, uma sessão nova. Se não der, despache um sub-agente genérico com o corpo de `${CLAUDE_PLUGIN_ROOT}/agents/ai-tells-reviewer.md` como instrução e a ordem explícita de só ler e não editar nada (se a variável não resolver, a raiz do plugin é a pasta dois níveis acima deste SKILL.md; só sem ela, localize a pasta do plugin `pm-chief-of-staff` no cache de plugins). Avise em 1 frase que ler a pasta do plugin pode pedir permissão e que, negada a leitura, o revisor não roda e a saída é a sessão nova.
- 5. Antes de reescrever, guarde a contagem de ocorrências por forma dos achados que o revisor confirmou. Ela é o "antes" do passo 7 e se perde quando a reescrita muda o rascunho. Depois reescreva só os trechos marcados.
- - Na antítese, corte a metade negativa e afirme só o fato.
- - Dois-pontos de prosa vira frase.
- - Título nomeia o assunto.
- - Frase de efeito sai inteira. O fato que ela enfeitava fica.
- - Cada coisa leva um nome só.
- - Travessão e bife viram vírgula, parênteses ou ponto. Aspa curva vira reta.
+ In Codex, which does not register the plugin's agent, open a new subagent, without a copy of this conversation's history and with the session's model. Its instruction is the body of `<plugin root>/agents/ai-tells-reviewer.md` below the frontmatter, the two paths and the explicit order to only read: do not edit, create or delete any file, and do not run any command that writes. The frontmatter `tools:` only restricts in Claude, so the order goes in the dispatch. The plugin root is `${CLAUDE_PLUGIN_ROOT}`; if the variable does not resolve, the folder two levels above this SKILL.md; only without it, the `pm-chief-of-staff` plugin folder in the Codex plugin cache. Without subagents in the session (feature off or denied), tell the person that the independent reading does not run here. They choose to stop or to go on with only the scan of step 3, and the delivery states that no separate reviewer read the text. The reviewer's reading is never done in this session in its place.
- A reescrita mantém número, nome próprio e sentido. Ela não cria forma nova (clivada, sinônimo de enfeite) nem troca afirmação verificável por hedge.
- 6. Confira a reescrita com a varredura do passo 3 e com uma chamada nova do revisor, que leva os mesmos dois caminhos (no Codex, outro subagente novo, aberto do mesmo jeito do passo 4). A continuação da primeira chamada já tem a lista anterior no contexto. Sem o `tells.md`, o que a pessoa marcou como jeito dela volta como achado. A segunda leitura pega o tell trocado por outro e o erro de gramática que a reescrita introduz. Achado novo ganha 1 rodada a mais, no máximo. O que sobrar vai declarado na entrega.
- 7. Entregue o texto limpo pronto pra copiar, uma linha de antes e depois por trecho e a contagem de cada forma nas duas versões. Quando o texto tem bloco de código, a cerca de fora leva mais crases que a de dentro, porque a cerca igual fecha o bloco no meio e quebra a cópia. A pessoa aprova tudo ou escolhe trechos.
- 8. Aplique no arquivo de origem só os trechos aprovados, quando houver origem. Antes, avise em 1 frase que editar a origem e salvar o texto colado podem pedir permissão. Negada a permissão, a origem fica como estava e o texto limpo segue na conversa para copiar. Cada trecho volta um por vez, com contexto bastante para aparecer uma vez só na origem, e nunca por substituição em lote, porque a cópia de dentro de um bloco de código mudaria junto. Trecho que sumiu da origem ou segue repetido fica de fora e vai declarado à pessoa. No fim, depois de aplicar ou de a pessoa desistir, apague só o rascunho criado nesta execução. Antes de apagar, avise em 1 frase que apagar o rascunho pede permissão. Negada ou com falha, diga à pessoa o caminho do rascunho e que ele fica na pasta até ela apagar, porque a pasta pode estar sob git. Pra texto colado, a pessoa escolhe onde salvar a versão limpa. Caminho que já existe nunca é substituído, porque o arquivo é da pessoa, e ela escolhe entre manter o arquivo, salvar com outro nome ou ver o diff.
+ In Claude Code, someone who installed or updated the plugin with the session open may not see the reviewer in the agent list. In that case, suggest `/reload-plugins` and, if the reviewer is still missing from the list, a new session. If that is not possible, dispatch a generic subagent with the body of `${CLAUDE_PLUGIN_ROOT}/agents/ai-tells-reviewer.md` as its instruction and the explicit order to only read and edit nothing (if the variable does not resolve, the plugin root is the folder two levels above this SKILL.md; only without it, locate the `pm-chief-of-staff` plugin folder in the plugin cache). Say in 1 sentence that reading the plugin folder may ask for permission and that, if the read is denied, the reviewer does not run and the way out is the new session.
+ 5. Before rewriting, save the count of occurrences per form of the findings the reviewer confirmed. It is the "before" of step 7 and is lost when the rewrite changes the draft. Then rewrite only the marked excerpts.
+ - In an antithesis, cut the negative half and state only the fact.
+ - A prose colon becomes a sentence.
+ - A heading names the subject.
+ - A punchline goes out whole. The fact it was dressing up stays.
+ - Each thing gets a single name.
+ - Em dash and en dash become a comma, parentheses or a period. A curly quote becomes straight.
- ## Aprender com a pessoa
+ The rewrite keeps numbers, proper names and meaning, and stays in the language of the text. It does not create a new form (cleft sentence, elegant variation) or swap a verifiable claim for a hedge.
+ 6. Check the rewrite with the scan of step 3 and with a new call to the reviewer, which takes the same two paths (in Codex, another new subagent, opened the same way as in step 4). A continuation of the first call already has the previous list in context. Without `tells.md`, what the person marked as their style comes back as a finding. The second reading catches the tell swapped for another and the grammar error the rewrite introduces. A new finding gets 1 more round, at most. Whatever remains goes stated in the delivery.
+ 7. Deliver, in the person's language, the clean text ready to copy, one before-and-after line per excerpt and the count of each form in both versions. When the text has a code block, the outer fence takes more backticks than the inner one, because an equal fence closes the block in the middle and breaks the copy. The person approves everything or picks excerpts.
+ 8. Apply to the source file only the approved excerpts, when there is a source. Before that, say in 1 sentence that editing the source and saving the pasted text may ask for permission. If permission is denied, the source stays as it was and the clean text stays in the conversation to copy. Each excerpt goes back one at a time, with enough context to appear only once in the source, and never by batch replacement, because the copy inside a code block would change along with it. An excerpt that disappeared from the source or is still repeated stays out and is stated to the person. At the end, after applying or after the person gives up, delete only the draft created in this run, never another `tells-draft*.md` nor a `rascunho-tells.md`. Before deleting, say in 1 sentence that deleting the draft asks for permission. If denied or failed, tell the person the path of the draft and that it stays in the folder until they delete it, because the folder may be under git. For pasted text, the person chooses where to save the clean version. A path that already exists is never replaced, because the file belongs to the person, and they choose between keeping the file, saving under another name or seeing the diff.
- Quando ela apontar um tell que passou, ou recusar um achado porque é o jeito dela de escrever, ofereça guardar isso em `.claude/skills/_shared/tells.md` da pasta dela. O arquivo tem 2 seções, "Tells que eu flagrei" e "Meu jeito, não marcar". A primeira linha segue o formato dos módulos, pra que a conferência de consumidores do `fechar-semana` não acuse órfão:
+ ## Learning from the person
+ When they point out a tell that slipped through, or reject a finding because it is their way of writing, offer to save it in `.claude/skills/_shared/tells.md` in their folder.
+
+ A new file has 2 sections, "Tells I caught" and "My style, do not flag", and its first line follows the module format, so the consumer check of `close-week` does not flag it as an orphan:
+
```
- **Carregado por:** `remove-ai-tells` (skill do plugin, fora de `.claude/skills/`)
+ **Loaded by:** `remove-ai-tells` (plugin skill, outside `.claude/skills/`)
```
- Crie o arquivo depois do ok dela. Avise antes, em 1 frase, que o pedido de permissão do `.claude/` vai aparecer e é esperado, e que, negada a escrita, o que ela marcou vale só nesta conversa. Arquivo existente é dela e pode ter sido editado à mão. Ele ganha a linha na seção certa e o resto fica como está.
+ An existing file belongs to them and may have been edited by hand. It gets the line in the matching section it already has, under the 0.8.0 name or the 0.7.0 name ("Tells que eu flagrei" for a caught tell, "Meu jeito, não marcar" for their style), and the rest stays as it is: no section is renamed or translated, and a `**Carregado por:**` first line stays.
+
+ Create or edit the file after their ok. Say first, in 1 sentence, that the `.claude/` permission prompt will appear and is expected, and that, if the write is denied, what they marked holds only in this conversation.