diff --git a/docs/plans/ops71-worktree-fix-sem-arg-driverless.md b/docs/plans/ops71-worktree-fix-sem-arg-driverless.md new file mode 100644 index 00000000..0ca8f935 --- /dev/null +++ b/docs/plans/ops71-worktree-fix-sem-arg-driverless.md @@ -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)