14 KiB
Impl: Modelos das flags do worktree: --zen → Space Bunny Free e --free → Space Bunny Alpha
Status: em execução Atualizado em: 2026-09-25 Issue: #1342 Intenção: docs/plans/worktree-modelos-space-bunny.md Appetite restante: herdado (~0,5 dia)
Leitura da intenção
- Outcome:
next,plan,newefixdevem abrir Space Bunny Free pelo OpenCode Zen com--zene Space Bunny Alpha pelo OpenRouter com--free; código, ajuda, comandos, skills e pin unitário que apresentam o mapa exibem a mesma associação. - O que NÃO negociar:
zen: 'opencode/space-bunny-free'efree: 'openrouter/stealth/space-bunny-alpha'; preset sem flag, demais flags, fail-high para múltiplas flags eMODEL_VARIANT = 'max'permanecem intactos. Não criar aliases, fallback, seletor, nova flag, mapa paralelo, persistência, migration, schema, UI ou alterações em registros históricos. - O que reavaliar: nenhuma hipótese de produto precisa ser reaberta. O owner, o transporte compartilhado por todos os propósitos e a ajuda derivada foram confirmados. Só reavaliar a sincronização manual se uma futura evolução exigir gerar documentação do mapa ou surgir outra superfície viva exibindo seus valores.
Abordagem recomendada
flowchart TD
A[Pin unitário: trocar os dois literais esperados] --> B[Teste direcionado: RED]
B --> C[Atualizar os dois valores em WORKTREE_MODEL_MAP]
C --> D[Atualizar o docblock stale do owner]
D --> E[Teste direcionado: GREEN]
E --> F[Sincronizar CLI, shell, comando e skill]
F --> G[Auditar as superfícies vivas do mapa]
G --> H[Smoke da ajuda sem provisionamento]
H --> I[pnpm gate:fast]
I --> J[Novo changelog OPS129]
J --> K[pnpm push e gates high-risk completos]
Opções consideradas: A | B | C
- A — Alterar os dois valores no owner, usar o pin unitário existente no fluxo RED/GREEN e sincronizar manualmente as superfícies documentais.
- B — Extrair ou gerar toda a documentação do mapa a partir de
WORKTREE_MODEL_MAP. - C — Introduzir aliases, um segundo mapa ou uma camada de compatibilidade entre os IDs antigos e novos.
Recomendação: A — porque o problema já tem um owner profundo e um pin exato; duas trocas de strings são o tracer bullet completo, preservam o contrato e cabem no appetite sem criar mecanismo novo. A ajuda já deriva do mapa, enquanto shell, comando e skill precisam apenas receber a associação vigente no mesmo lote.
Rejeitadas: B — porque transformaria uma troca values-only em refatoração de geração de documentação, ampliaria o risco de formato e manutenção e violaria o limite de um único mapa owner; C — porque preservaria os IDs antigos como semântica de runtime, criaria uma segunda política de escolha e contrariaria a troca direta aprovada. A decisão de manter sincronização manual só deve ser revista se surgirem novas superfícies vivas ou uma necessidade concreta de gerar documentação do mapa.
Decisões de engenharia
- Ownership: editar
WORKTREE_MODEL_MAP; não introduzir constantes por provider, aliases ou exceções por propósito. - TDD: alterar primeiro apenas o
toEqualdo pin existente e observar a falha causada pelos valores antigos; só depois mudar o owner. - Resolução: reutilizar
resolveWorktreeModel,WORKTREE_MODEL_FLAGSe o allowlist existentes.next,plan,newefixjá compartilham a resolução e o transporte;fixnão ganha caminho especial. - Documentação viva: sincronizar somente onde os IDs são exibidos. A ajuda de
scripts/worktree.mjs:992-996já deriva do owner e não recebe literal duplicado. - Transporte: não alterar
parseModelRefnemMODEL_VARIANT. O parser divide no primeiro slash, portantoopenrouter/stealth/space-bunny-alphachega como provideropenroutere idstealth/space-bunny-alpha. - Histórico: acrescentar proveniência da OPS129 onde houver notas vivas, sem reescrever os registros de OPS100/OPS112 ou planos antigos.
Componentes / mudanças
WORKTREE_MODEL_MAP(scripts/lib/worktree.mjs:43-63): trocar somente os valoreszenefree; atualizar o docblock stale que ainda identifica--zencomo Muse Spark 1.3 Free. Chaves, ordem,WORKTREE_MODEL_FLAGS,resolveWorktreeModel, preset e demais modelos permanecem iguais.- Docblock e ajuda do CLI (
scripts/worktree.mjs:22-30,scripts/worktree.mjs:973-1003): atualizar os dois IDs no docblock e a proveniência viva. Não editar a interpolação da ajuda, que já mostraWORKTREE_MODEL_MAPautomaticamente. - Launcher shell (
.agents/shell/worktree.sh:23-28): atualizar a associação de--zene--free; preservar as linhas de uso que já listam apenas as flags. Acrescentar OPS129 à nota de proveniência sem apagar OPS100/OPS112. - Comando
/worktree(.opencode/commands/worktree.md:7): atualizar os dois IDs e manterat-most-onee os contratos decd/launch intactos. - Skill do worktree (
.agents/skills/worktree-next-issue/SKILL.md:32-34): atualizar apenas os IDs e a proveniência na linha 34. A linha 32, que lista flags sem IDs, não precisa mudar. - Pin unitário (
tests/unit/worktree.unit.spec.ts:469-523): primeiro mudar os dois valores esperados; manter intactas as provas de flag set, preset, resolução individual, fail-high e diretivas denext/plan/new. - Registro da entrega (
docs/changelog/2026-09-25-ops129.md): criar uma entrada curta nova com os dois remaps e as invariantes preservadas; não alterar changelogs anteriores nem o agregado gerado. - Transporte fora da mudança (
scripts/lib/agent-session.mjs,tests/unit/agentSession.unit.spec.ts): não editar. Os exemplos genéricos de ref com slash e a cobertura deparseModelRefnão apresentam o mapa;MODEL_VARIANTcontinuamax. - Migration: sem migration; não há schema ou Payload.
- Access / Consent: N/A; não há collection, write path, role, helper ou chave LGPD.
- UI: Impeccable A — N/A, sem UI; nenhum designer, shell visual, shape, craft ou polish.
- Codebase map: sem mudança; nenhum módulo muda de camada ou de owner.
Dados → forma
- N/A como visualização: não há métrica, série ou comparação para o usuário.
- A forma técnica escolhida é o dicionário fixo
flag → model referencejá existente. Os valores novos são configuração executável, não conteúdo duplicado de catálogo; somente as superfícies vivas que exibem o mapa recebem a nova associação textual.
Fases verificáveis
-
TDD RED — 20 min
- Em
tests/unit/worktree.unit.spec.ts, alterar primeiro apenasWORKTREE_MODEL_MAP.zeneWORKTREE_MODEL_MAP.freenotoEqualpara os literais novos. - Executar
pnpm test:unit tests/unit/worktree.unit.spec.ts. - Confirmar RED por divergência entre os literais esperados e os antigos no owner. Não alterar owner nem documentação antes de registrar essa falha.
- Em
-
Owner e GREEN — 30 min
- Trocar em
scripts/lib/worktree.mjssomente os dois valores do mapa. - Atualizar o comentário stale imediatamente acima do mapa para Space Bunny Free e Space Bunny Alpha, preservando a proveniência histórica relevante.
- Não modificar
WORKTREE_MODEL_FLAGS,resolveWorktreeModel, as outras cinco entradas, o preset ouMODEL_VARIANT. - Reexecutar
pnpm test:unit tests/unit/worktree.unit.spec.tse confirmar GREEN, incluindo as invariantes existentes de preset, fail-high e transporte.
- Trocar em
-
Sincronização das superfícies vivas — 45 min
- Atualizar os IDs no docblock de
scripts/worktree.mjs, shell, comando e skill. - Manter a ajuda de runtime derivada do mapa; confirmar por inspeção que ela não contém literal próprio.
- Fazer busca exata dos IDs antigos apenas nos seis arquivos vivos que apresentam o mapa, confirmando que não sobrou associação antiga.
- Permitir IDs antigos apenas onde são semanticamente corretos: registro histórico, intenção atual, exemplos genéricos de parser e este plano. Não editar
agent-session.mjs, seu teste,codebase-map,local-databaseou documentos históricos.
- Atualizar os IDs no docblock de
-
Smoke e gates — 1 h 15 min
- Reexecutar
pnpm test:unit tests/unit/worktree.unit.spec.ts. - Executar
node scripts/worktree.mjssem subcomando e validar a saída de uso, conferindo--zen=opencode/space-bunny-freee--free=openrouter/stealth/space-bunny-alphasem provisionar worktree ou banco. - Executar
pnpm gate:fastpara lint, typecheck e unit completo. - Não criar teste e2e: a mudança não introduz fluxo visual nem integração de aplicação. Os arquivos
scripts/worktree.mjsescripts/lib/worktree.mjssão high-risk; o push deve respeitar a expansão automática para unit/int full e e2e curado, sem editar manifest nem tentar seleção vazia.
- Reexecutar
-
Changelog e push — 1 h
- Criar somente
docs/changelog/2026-09-25-ops129.md; não rodarpnpm changelog:buildnem commitar o agregado. - Rodar
pnpm changelog:checke revisar o diff para confirmar que contém apenas o plano, o pin, o owner, as superfícies vivas, a nova entrada e os ajustes documentais necessários. - Entregar com
pnpm push -u origin HEAD; registrar o resultado dos gates high-risk completos. - Abrir PR Ready para
maincomCloses #1342e deixar o auto-merge nativo aguardarCI (PR) / checks.
- Criar somente
Rabbit holes / Não escopo (engenharia)
- Não criar
WORKTREE_MODEL_MAPparalelo, mapa por provider, aliases, fallback, seletor, variável de ambiente nova ou persistência da escolha. - Não renomear
--zen/--free, adicionar flag, alterar precedência, allowlist ou comportamento para múltiplas flags. - Não alterar
cheap,pro,go,alibabaouglm, nem revisar o restante do catálogo. - Não alterar
MODEL_VARIANT,parseModelRef,buildCreateSessionBody, ciclo de sessão ou o transporte de headless. - Não criar caminho especial para
fix; allowlist ecmdNamespaceBranchjá o levam ao mesmolaunchModel. - Não substituir exemplos genéricos de slash em
agent-session.mjs; eles não exibem o mapa e sua troca seria ruído documental. - Não reescrever
docs/plans/worktree-modelos-go-zen.md,docs/plans/worktree-launch-honra-flags.md,docs/changelog/2026-09-15-ops112.md,docs/changelog/2026-08-27-ops100.mdou a intenção desta Issue. - Não adicionar migration, schema, access, Consent, UI, componente, utility, módulo ou abstração.
- Não atualizar
codebase-map, manifests de risco ou skills que apenas enumeram flags sem IDs. - Não provisionar worktrees reais para o smoke; isso criaria branch, bancos e efeitos externos sem benefício para uma troca de constantes.
- Não adicionar e2e específico; unit puro, ajuda e gates existentes cobrem a mudança com menor acoplamento.
Riscos e mitigação
- Documentação viva divergir: limitar a edição às quatro superfícies listadas, atualizar a ajuda por derivação e fazer busca exata nos arquivos-alvo após o lote.
- Busca ampla sinalizar falsos positivos: IDs antigos continuarão legitimamente em histórico, intenção e exemplos genéricos de parser; avaliar o contexto, não exigir zero ocorrências no repositório inteiro.
- Ref com slash adicional em
--free:parseModelRefdivide no primeiro slash e preservastealth/space-bunny-alphacomo id; o pin e a cobertura genérica existente verificam a associação e a capacidade do parser. - Regressão em
maxou demais flags: não tocar no transporte e preservar otoEqualcompleto das sete entradas e as asserções existentes de preset/fail-high. fixficar sem prova direta no pin de diretiva: a allowlist já incluifix, eplan/new/fixusam o mesmocmdNamespaceBranch,resolveLaunchModeleprintLaunchDirective; não criar branch de código apenas para duplicar essa prova.- Classificação high-risk ampliar tempo ou suites: aceitar o cascade oficial, sem bypass, seleção vazia ou alteração do manifest; o push deve produzir full unit/int e e2e curado.
- Mudança parecer maior que values-only: limitar o diff aos literais e à sincronização documental; qualquer novo mecanismo exige revisão da decisão e não cabe nesta entrega.
Aceite de engenharia
WORKTREE_MODEL_MAP.zen === 'opencode/space-bunny-free'.WORKTREE_MODEL_MAP.free === 'openrouter/stealth/space-bunny-alpha'.next,plan,newefixaceitam--zene--freepelo mesmoresolveWorktreeModele transportam o valor resolvido.- Space Bunny Free é associado ao provider
opencode/OpenCode Zen e Space Bunny Alpha ao provideropenrouter/OpenRouter. - A ajuda de
node scripts/worktree.mjsmostra os dois novos valores sem provisionamento. - Docblock do CLI, shell, comando e skill não exibem os IDs antigos como associação vigente.
- O pin unitário foi alterado primeiro, houve RED e depois GREEN.
- Preset sem flag, outras cinco flags e a lista de flags permanecem idênticos.
- Múltiplas flags continuam falhando alto sem adivinhação.
MODEL_VARIANTcontinuamax; nenhum transporte foi alterado.- Planos, changelogs antigos e exemplos genéricos de parser não foram reescritos.
- Nenhum mapa paralelo, alias, fallback, seletor, flag, persistência, migration, schema, access, Consent ou UI foi criado.
pnpm test:unit tests/unit/worktree.unit.spec.tsepnpm gate:fastestão verdes.- O smoke da ajuda confirma os dois valores sem efeitos externos.
- O push respeita a classificação high-risk e registra unit/int full e e2e curado.
- A nova entrada
docs/changelog/2026-09-25-ops129.mdestá incluída sem modificar o agregado. - Nenhum manifest ou codebase map foi alterado sem necessidade arquitetural.
Self-score decision-quality: 5/5 — as alternativas e rejeições preservam o owner único, a escolha cabe no appetite values-only, os rabbit holes e a busca distinguem superfície viva de histórico, o mecanismo profundo existente é reutilizado e o aceite mantém literalmente as duas associações e todas as invariantes para os quatro comandos.