This commit is contained in:
Francisco Solla 2026-09-20 16:29:27 -03:00
parent c7eeb5dbd8
commit af455e55bb

View file

@ -0,0 +1,78 @@
# Tornar worktree `fix` (sem argumento) driverless, espelhando `plan`
Status: rascunho
Atualizado em: 2026-09-20
Issue: #1226
Priority: P2
Impeccable: A — N/A
Design UI: N/A
Appetite: ~0,5 dia eng; um outcome verificável
Responsável: —
## Intenção
`pnpm worktree fix` sem argumento hoje abre a sessão e auto-envia a string vazia como mensagem do usuário, resultando em um prompt vazio para o agente. O `plan` (sem bag) já é driverless — abre a sessão sem mensagem, esperando o humano digitar o contexto. O `fix` deve espelhar esse comportamento: sem argumento → sessão aberta, nenhuma mensagem automática.
## Persona e fluxo
- **Persona / contexto:** dev que identificou um bug e quer diagnosticar interativamente (campo/mesa, terminal)
- **Job principal:** Abrir uma sessão `fix` sem bag sem que o agente receba uma mensagem vazia
- **Fluxo desejado:** `pnpm worktree fix` → sessão abre, prompt vazio → humano digita o contexto do bug
- **Anti-goals de produto:** Não quebrar `pnpm worktree fix "descrição do bug"` — o caso com argumento continua funcionando como hoje
### Esboço de fluxo
```text
fix (sem arg) → sessão aberta, prompt vazio → humano digita
fix (com arg) → sessão aberta, argumento sanitizado auto-enviado (como hoje)
plan (sem arg) → sessão aberta, prompt vazio (referência — sem mudança)
```
## Objetivo e aceite
- `pnpm worktree fix` (sem argumento) abre sessão driverless — nenhuma mensagem automática enviada
- `pnpm worktree fix "descrição"` continua funcionando como hoje (argumento sanitizado → mensagem auto-enviada)
- `pnpm worktree fix --auto` (sem argumento) lança erro alto explicando que `--auto` exige um bag
- Testes unitários atualizados cobrem o novo comportamento
## Dados (intenção)
- **Vou apresentar dados?** N/A — feature de tooling interna, sem métrica de produto
- **Decisões desbloqueadas:** Executor — comportamento driverless do fix sem bag
- **Forma:** adiada ao plano de implementação
## Dados da decisão (literais)
- `if (purpose === 'plan' && !sanitized) return null` — padrão existente em `scripts/lib/agent-session.mjs:212`
- Nova linha: `if (purpose === 'fix' && !sanitized) return null` — posição imediatamente abaixo, antes do `auto` check
## Direção no codebase (hipótese)
- **Áreas prováveis:** `scripts/lib/agent-session.mjs` (`purposeInvocation`), `scripts/lib/worktree.mjs` (`assertSkillAutoSupported`), `tests/unit/agentSession.unit.spec.ts`, `tests/unit/worktree.unit.spec.ts`
- **Precedente a olhar:** OPS119 — `plan` sem bag driverless (linha 212 do `agent-session.mjs`)
- **Risco de acoplamento:** Baixo — mudança pontual em lógica de sanitização de argumento, não toca collections/negócio
## Dependências
- OPS119 (referência de padrão já implementado para `plan`)
## Fora de escopo
- Mudar comportamento de `plan` sem bag (já é driverless)
- Alterar `new` ou `next` (fora do escopo desta issue)
## Rabbit holes de produto
- **Refatorar sanitização unificada.** Se alguém "só completar" a limpeza: explosão de escopo. **Corte neste item:** adicionar apenas a linha `if (purpose === 'fix' && !sanitized) return null`, sem refatorar o bloco `fix || plan`.
## Questões em aberto (produto)
- Nenhuma — comportamento espelhado do `plan` já validado em produção (OPS119).
## Referências
- `scripts/lib/agent-session.mjs:208-217` — `purposeInvocation`, bloco `fix || plan`
- `scripts/lib/worktree.mjs:142` — `assertSkillAutoSupported`, lógica de `--auto`
- `tests/unit/agentSession.unit.spec.ts:243-252` — testes de `fix` com/san bag
- `tests/unit/worktree.unit.spec.ts:599-604` — testes de `assertSkillAutoSupported`
- `AGENTS.md` — convenção de sessões driverless (OPS119)