fix¶
De um relatório de defeito ao requisito aceito que ele quebra, corrigido, a um plano de uma tarefa e ao mesmo portão. Sem entrevista e sem contrato para aceitar antes; uma aprovação de proposta, e nenhum atalho na evidência ou no review.
| Papel | Quem conserta sem ampliar. Reproduz primeiro, corrige o requisito para que um teste falhe hoje e passe amanhã, não muda nada que o defeito não exija. |
| Quem decide | Você aprova a proposta na conversa: o defeito, o requisito corrigido e o plano; o assistente a registra com atipspec accept <slug> proposal --code <code>, o código que atipspec proposal <slug> mostrou. Ponto de parada 1. Depois você aceita o resultado, como em qualquer entrega. |
| Produz | o requisito em specs/<capability>.md corrigido, spec.md com o defeito, plan.md com uma tarefa, código, evidência |
Como executar¶
atipspec new bug-123 --title "Reset link never expires" --capability auth --ticket SHOP-9 --kind fix
A skill executa atipspec fix bug-123, que recusa em uma entrega que não é
um fix e, caso contrário, imprime o workflow, as regras e o contexto. Um
fix, como uma entrega de feature, não precisa da aceitação do contrato para
começar; enquanto o contrato não está aceito, check mostra um aviso.
O que new --kind fix cria¶
Uma entrega guiada (schema: 2), como uma feature, com kind: fix,
requirements: [], risk: normal e baseline.json, que registra o commit
de onde parte; new recusa enquanto a spec viva da capacidade tem mudanças
sem commit. Seu spec.md contém o defeito, não um
requisito:
---
title: "Reset link never expires"
status: draft
kind: fix
capability: auth
ticket: SHOP-9
schema: 2
requirements: [REQ-002]
risk: normal
---
# Reset link never expires
## Defect
Observed: a link created 26 hours ago still opens the reset form.
Expected: the page shows "link expired", as REQ-002 states.
Reproduction: `python -m pytest tests/auth/test_reset.py -k expired`
O plano tem uma tarefa, T1: Regression test and fix, e uma
## Final verification cujo Verify: lista todo require-command do
contrato e um marcador de posição para o comando que executa o teste de
regressão.
O que o modelo faz¶
- Reproduz o defeito e preenche
## Defect:Observed:eExpected:são obrigatórios,Reproduction:é recomendado. -
Encontra o requisito que o defeito quebra em
.atipspec/specs/auth.md, lista seu ID emrequirementse o corrige ali, mantendo seu ID: adiciona um critério de regressão sob ele, ou reescreve o critério que deixou o defeito passar.### REQ-002: The link expires #### AC-003: Link older than 30 minutes - **WHEN** a link issued 31 minutes ago is opened - **THEN** the page shows "link expired" #### AC-007: Link issued the day before - **GIVEN** a link issued 26 hours ago - **WHEN** the user opens it - **THEN** the page shows "link expired" and sends nothing -
Preenche o plano:
scope, a abordagem,Covers: REQ-002, os critérios do requisito emTests:, o de regressão inclusive, e o comando de teste emVerify:no lugar do marcador de posição. - Propõe o risco em
spec.md. - Apresenta
atipspec proposal bug-123, que mostraKind: fix · Risk: ...,Corrects: REQ-002 (accepted requirement)e o diff da spec viva contra os requisitos aceitos no commit base da entrega, e pede sua aprovação. - Após a aprovação, escreve o teste de regressão, vê-o falhar, faz a menor
mudança, registra
task-done, executaverifye entrega o pacote de review a um revisor. - Apresenta
atipspec report bug-123para sua aceitação do resultado, e entãodeliverescreve o requisito corrigido na spec viva. A história do defeito fica na entrega arquivada.
Cerca de dez comandos: new, fix, proposal, accept proposal,
task-done, verify, review, report, accept result, deliver.
O que check exige de um fix¶
baseemspec.mdé o id completo do commit queatipspec newregistrou: um commit no histórico deHEAD, e o head quebaseline.jsonregistra. Um nome comoHEADou um branch, ou outro commit, é um erro: um posterior deixaria os commits entre o registrado e ele fora da comparação, da verificação de escopo e do diff do dossiê, e um anterior compararia com requisitos que ainda não estavam aceitos. Uma entrega migrada a partir de uma antiga mantém sua base anterior, que não pode ser posterior a esse head.requirementslista pelo menos um requisito, e cada um está entre os requisitos quespecs/<capability>.mdcontinha no commit base da entrega, ou que chegaram a ele desde então por meio do branch de integração (veja equipes) ou de uma entrega arquivada no branch depois da base, tal como seu recibo registra que essa entrega o escreveu: um fix corrige um requisito que a capacidade já aceitou. O arquivo de trabalho ebaseline.jsonnão mudam essa lista, ecapabilityé a que ospec.mdnomeia, mesmo quandonewrecebeu outra. Um requisito que não está ali é um erro, já que um comportamento que nenhum requisito cobre é uma entrega de feature. Somente em um projeto cujas specs vivas não continham nenhum requisito na base (um projeto existente sem specs) o fix pode escrever o primeiro, com um info; um fix cuja capacidade não tem nenhum enquanto outras têm é um erro que pede acapabilitycorreta.- Um fix muda apenas os requisitos que lista, e não remove nenhum: um
requisito adicionado, alterado, excluído ou marcado
[remove]na spec viva da sua capacidade sem estar listado é um erro, assim como um listado marcado[remove]ou qualquer requisito alterado na spec viva de outra capacidade, que a proposta também mostra como um diff. O que o branch de integração ou uma entrega arquivada desde a base trouxe não é mudança do fix; o que um merge de qualquer outro branch traz é. Quando a mudança está commitada no branch, a mensagem diz que outra mudança pode tê-la feito, e então ela precisa de uma entrega própria. merge-checkverifica o mesmo contra o branch de destino: um fix arquivado no branch cujo requisito não estava na spec viva na base do merge, nem foi escrito por uma entrega anterior do branch, bloqueia o merge, assim como um requisito alterado fora das entregas que o listam.- Pelo menos um critério dos requisitos corrigidos está em
Tests:: o teste de regressão automatizado. ## DefectdeclaraObserved:eExpected:.- Mais de 2 requisitos é um aviso (
max_requirementsquando for menor): um reparo que precisa de mais não é um fix.
Todo o resto é o de uma entrega guiada: uma aprovação de proposta, evidência
vinculada à árvore, o review em uma sessão isolada (declarada em
session:), sua aceitação do resultado, deliver e merge-check.
Risco¶
risk em spec.md define quanta cerimônia o portão pede, para um fix como
para qualquer entrega: low para um reparo local cujo teste de regressão o
plano nomeia em Proof:, que então não precisa de veredito do revisor;
high para segurança, dinheiro, dados ou permissões. Você o aprova com a
proposta; mudá-lo anula essa aprovação. Veja risco.
Fixes criados antes da 0.3.0¶
Um fix sem schema: 2 em seu spec.md mantém seu próprio fluxo até ser
arquivado: ele precisa da aceitação do contrato para começar, do seu
requisito embutido e de accept <slug> spec, e não tem aceitação de plano.
deliver mescla seu requisito na spec viva como antes.