Pular para conteúdo

Sprint 030 — Registro de aceitação

Features: 060 — a tela da equipe (US1–US5, US9) · herança de 045 (D06 da v0.7.0) e de 055 (FR-003 e o ato de subequipe) Avaliado em: 2026-09-14, na development em 0ccf02b, com evidência executada — testes nomeados com código de saída, sonda de tela sobre cenário real, leitura de migração e de protótipo. Suíte inteira e gates não rodados: a run do CI 34779226200 é a evidência. Papel: Product Owner — avaliação proposta pelo agente, em duas partes escritas por duas execuções do papel (a 060; a herança). Confirmação pela pessoa alocada ao papel: PENDENTE. Tipo de PO: sro.product_owner_client — quem demanda é quem mantém. Registro retroativo: o sprint correu sem backlog, sem issue e sem iteration (2026-09-07 a 2026-09-12); este registro nasce depois da v0.8.0 já ter sido avaliada carregando estes entregáveis. sro.rule01 (US materializada tem de estar no sprint backlog) não é verificável para este sprint.

Resumo

Quantidade
Entregáveis avaliados 9 — seis da 060 (D1–D6), três de herança (H1–H3)
Aceitos 2 — D3 (US4) e H3 (subequipe numa transação)
Não aceitos por defeito observado 1 — D6 (US9: cartão fora do protótipo)
Não aceitos por critério não medido 4 — D2 (US3), D4 (US2), D5 (US5), H1 (#853)
Não aceitos por teste prometido ausente 1 — D1 (US1)
Não aceitos por régua não aprovada e critérios não conformes 1 — H2 (#863)
Não avaliado 1 — o #860, a aba Flow per person (US10–US12 da extensão, sem tarefa)
Tarefas da 060 executadas com sucesso 18 — T001–T009, T013, T014, T016–T018, T021, T024, T026, T027
Tarefas da 060 executadas sem sucesso 9 — T010–T012, T015, T019, T020, T022, T028, T029
Tarefas não avaliadas 2 — T023, T025 (fechamento)

Quatro das sete recusas são por avaliação incompleta, não por comportamento errado — e podem virar aceitas no mesmo ato da confirmação, se o papel medir SC-013, decidir a leitura de AC2, e medir SC-005/FR-081. Os dois defeitos de comportamento são o cartão Squads at a glance (D6) e a régua furada do vínculo declarado (H2). O registro que mais pesa não é de critério: é que nenhum dos dez PRs do sprint tem revisão registrada, e quatro nem pediram.


Parte A — a feature 060

Feature: 060-tela-da-equipe — US1, US2, US3, US4, US5, US9. US6, US7, US8 ficaram fora (PR 2) e não são avaliadas aqui. Avaliado em: 2026-09-14, na development em 0ccf02b (árvore limpa), com evidência executada nesta avaliação — mix test <arquivo> com echo $? capturado logo depois, e leitura do HTML renderizado onde o critério é de tela. Suíte inteira e gates não foram rodados aqui: a run do CI 34779226200 sobre 0ccf02b (push, conclusion: success, 2026-09-13T19:56:51Z) é a evidência da suíte. Papel: Product Owner — avaliação proposta pelo agente; confirmação pela pessoa alocada pendente. Tipo de PO: sro.product_owner_client — quem demanda é quem mantém.

Lacunas de registro que atravessam todos os entregáveis

Lacuna O que se observou Consequência
Sem issue no GitHub gh issue list --state all --search "060" → []; busca por "tela da equipe", "Structure roster", "Flow per person" só devolve issues de 055/057/058 nenhuma US nem tarefa da 060 tem # — a coluna Materializa diz "sem issue"; flow.wip.count nunca contou este trabalho
Sem sprint backlog do 030 docs/sprints/ termina em 029-medidas-da-equipe; não existe 030/ sro.rule01 (US materializada tem de estar no sprint backlog) não é verificável — o registro é retroativo, e isto é lacuna, não conformidade
Revisão não registrada (#817, #819, #821) reviewRequests = [The-Band-Solution/the-band], reviews = [] revisor pedido à equipe, como manda a casa; revisão registrada: não. Situação a classificar pelo papel: atestada sem registro (com data e frase) ou não ocorreu
PR #860 sem revisor pedido reviewRequests = [], reviews = [], mergeado 2026-09-12 viola "todo PR nasce com revisor pedido"; entra como não conformidade de processo em D6
Cinco arquivos de teste prometidos no tasks.md não existem com o nome prometido abas_da_equipe_test, estrutura_membros_test, estrutura_permissao_test, saida_na_tela_test, equivoco_na_tela_test — ausentes por nome ver, por entregável, onde a asserção prometida foi encontrada — ou não


D1 — As duas abas, e a lista de membros por vínculo com origem, papel, início e subequipes

Produzido por: T010, T011, T012, T013 (tela) · sustentado por T001–T003 (PR #817), T004 (PR #819), T005–T009 e T024 (PR #821) Materializa: US1 — Quem está na equipe, e de onde veio cada afirmação (P1, atômica) · sem issue

Comandos: - MIX_ENV=test mix test test/the_band/ontology/seon/eo/roster_test.exs test/the_band_web/live/teto_de_consultas_da_equipe_test.exs test/the_band_web/live/duas_afirmacoes_test.exs test/the_band_web/live/estado_na_url_test.exs test/the_band/ontology/seon/eo/isolamento_da_060_test.exs test/the_band/tenants/gerir_estrutura_test.exs → 65 passed, 0 failures, EXIT=0 (log scratchpad/us1-run.log). - Sonda de tela (fora do repositório, scratchpad/sonda_060b_test.exs, mix test <caminho> --seed 0 → 3 passed, EXIT=0, log scratchpad/sonda-run.log): equipe com quatro pessoas — Ana (declarada, papel, início 2026-01-01), Bia (observada, sem papel), Caio (declarado, saída em 2026-06-01), Dora (declarada, equívoco "cadastro errado") — renderizada por conta administradora e por conta member sem pessoa ligada.

Critério Tipo Conforme Evidência
AC1 — cada pessoa uma vez, com papel ou não declarado, origem (observado / declarado por X em D), início ou desconhecido, subequipes (FR-009, FR-010) funcional sim roster_test.exs:100-167 (uma linha por pessoa, vínculos dentro); sonda [PALAVRA]: observed, declared by, unknown, not declared, direct — todos presentes em texto no HTML de ?tab=structure
AC2 — direta e em subequipe: uma linha, marca direta e a subequipe, contada uma vez funcional sim roster_test.exs:101 "direta na equipe E numa subequipe: uma linha, dois vínculos"; :129 "os chips: squads traz a PARTE, e direct diz que há vínculo na própria equipe"; :146 só na subequipe, sem direct
AC3 — quem saiu permanece, marcada saiu em D, com período e autor, fora dos vigentes (FR-011) funcional sim roster_test.exs:301 "fim DECLARADO traz autor e o instante do registro"; sonda [HEADER] "2 people here · 1 left" com Caio encerrado; palavra left presente
AC4 — equívoco permanece, marcado, com razão/autor/data, e o texto diz excluído de toda medida em toda data (FR-011) funcional sim roster_test.exs:361 "o equívoco traz razão, autor e instante"; legenda da lista show.ex:5001 "mistake — the person was never here. The link counts for no date at all."; sonda [HEADER] "1 recorded by mistake"
AC5 — origem ainda lista quem a organização declarou saído: as duas afirmações lado a lado, tela não escolhe (FR-013, 055 FR-012) funcional sim duas_afirmacoes_test.exs:71 "a tela mostra AS DUAS afirmações, cada uma com a sua origem"; :92 "não escolhe"; :107 sentido inverso; :122 equívoco é caso próprio
AC6 — conta não administradora e sem concessão lê a lista inteira e nenhuma ação de escrita (FR-006, SC-011) funcional sim sonda [LEITOR botões] — Declare role, Add role, Left the team, Mistake…, New role, Change: todos false; saida_e_equivoco_na_tela_test.exs:232
AC6' — a tentativa por evento é recusada com o motivo nomeado (FR-006, FR-082) funcional sim sonda [LEITOR promover / criar_papel / registrar_saida / registrar_equivoco] → flash "Your account is not linked to a person yet, and managing a team's structure is granted to organisational roles." — recusa, não exceção; os três motivos no domínio: gerir_estrutura_test.exs:127-185
AC7 — a distinção observado/declarado/saiu/equívoco sobrevive sem cor (SC-004) funcional sim sonda: as quatro marcas são palavras no HTML; legenda show.ex:4996-5008 em <dl> textual
FR-001, SC-007 — aba na URL; sem ?tab → Dashboard; inválida → Dashboard e aviso funcional sim sonda [ABAS]: sem tab → Dashboard aria-selected="true"; ?tab=structure → Structure aria-selected="true"; ?tab=members → Dashboard e flash "A team has no “members” tab. Showing the dashboard."; show.ex:150-154. Nota: existem três abas (Flow per person, ?tab=people) — emenda declarada em FR-085 da extensão de 2026-09-08, não divergência
FR-004 — cabeçalho comum: nome, origem da equipe, N vigentes, M sem papel, composta de K funcional parcial sonda [HEADER]: "SONDA · 2 people here · 1 left · 1 recorded by mistake · 1 with no organisational role · source github … collected at …" — N, M e origem conformes; "composta de K subequipes" não sondado (a equipe da sonda não tem partes; equipe_composta_test roda verde mas a asserção do cabeçalho não foi conferida por nome)
FR-012 — vigentes, saíram e equívocos contados à parte, batendo com a consulta funcional sim roster_test.exs:180 "vigentes, saíram e equívocos somam o total de pessoas do roster"; :231 invalidado + vigente conta como vigente; sonda: 2 · 1 · 1 sobre 4 pessoas
SC-004, FR-008 — 0 linhas com nível de acesso da plataforma não funcional sim roster_test.exs:420 "nível de acesso da plataforma NÃO sai do roster (FR-008, SC-004)"; sonda [MAINTAINER?] false | access-at-platform? false; screens_test.exs:148-163
FR-005 — leitura sem permissão de administrar; tudo restrito ao tenant não funcional sim sonda: conta member abre ?tab=structure; isolamento_da_060_test.exs:61-176 (roster, totais, alcance, comandos); screens_test.exs:210,218 equipe de outro tenant → redirect
Teto de consultas da aba (T013) — constante em 1×11 pessoas e 1×3 subequipes não funcional sim teto_de_consultas_da_equipe_test.exs:242 "o número de consultas não cresce com as pessoas"; :270 "nem com as subequipes"; :295 teto declarado @teto_da_estrutura 7; :317 uma aba não paga a outra
Processo (constituição XI) — o teste prometido no tasks.md existe, com asserção nomeada processo não T010 abas_da_equipe_test.exs (cinco casos, assert_patched): não existe — o comportamento só está provado pela sonda desta avaliação, que não vive no repositório e não guarda regressão. T011 estrutura_membros_test.exs: não existe (marcas em texto cobertas parcialmente por screens_test.exs:163 e pela sonda). T012 estrutura_permissao_test.exs ("os três motivos por evento"): não existe; a recusa por evento está espalhada em saida_e_equivoco_na_tela_test:240, declarar_papel_na_linha_test:393, papeis_na_estrutura_test:270, sempre com um motivo; promover só foi provado pela sonda
Processo — PR com revisor pedido, review registrada, ligado ao projeto processo não #817: revisor the-band pedido, reviews=[], no projeto com Status=Done e Iteration=null; #819 e #821: revisor pedido, reviews=[], fora do projeto

Fase derivada: sro.not_accepted_deliverable — todos os critérios funcionais e não funcionais da US1 estão conformes com evidência executada; a recusa é pelo critério de processo da constituição XI: três tarefas marcadas [x] cujo teste prometido não existe no repositório. Leitura alternativa para o papel: aceitar pelo valor entregue e abrir tarefa nova para os três arquivos de teste — o agente registra as duas e não escolhe a que fecha o sprint. Fase da tarefa: T010, T011, T012 — sro.non_successfully_performed_scrum_development_task (teste prometido ausente); T013 — sucesso; T001–T009, T024 — sucesso pelos seus próprios critérios (todos os arquivos existem e rodaram verdes). O que faltou: os três arquivos de teste, com as asserções nomeadas em tasks.md — a sonda desta avaliação (scratchpad/sonda_060b_test.exs) já é o esqueleto deles.

D2 — A saída declarada: o vínculo ganha fim, autor e instante, e a coleta não desfaz

Produzido por: T008, T014, T015 · PR #821 (T008 já em #821; migração saida_declarada_com_autor) Materializa: US3 — A pessoa saiu, e o que ela fez continua contando (P1, atômica) · sem issue

Comando: MIX_ENV=test mix test test/the_band/ontology/seon/eo/saida_declarada_test.exs test/the_band/ontology/seon/eo/vinculo_observado_test.exs test/the_band_web/live/saida_e_equivoco_na_tela_test.exs test/the_band/ontology/seon/eo/discordancia_test.exs test/the_band/ontology/seon/eo/team_membership_test.exs → 54 passed, 0 failures, EXIT=0 (2026-09-14, 0ccf02b; log em scratchpad/us3-us4-run.log).

Critério Tipo Conforme Evidência
AC1 — saída em D dá fim ao vínculo, guarda quem e quando, nenhuma linha removida (FR-019, FR-021) funcional sim saida_declarada_test.exs:82 "quem tem dois papéis vigentes sai numa chamada, e os dois ficam encerrados"; :157 "saída sem autor é recusada"; saida_e_equivoco_na_tela_test.exs:93 "registrar a saída fecha o vínculo e diz quantos alcançou"
AC2 — números de período anterior a D são exatamente os mesmos (FR-020, SC-001) funcional sim saida_declarada_test.exs:110 "o número de um período anterior à saída é o mesmo antes e depois (SC-001)" — compara count_team_members_at antes/depois
AC3 — data no futuro recusada com razão (FR-023) funcional sim saida_declarada_test.exs:139 "data no futuro é recusada"; saida_e_equivoco_na_tela_test.exs:127 idem na tela
AC4 — depois da saída, coleta não recria enquanto a origem lista; tela mostra as duas afirmações (FR-026, SC-002) funcional sim saida_declarada_test.exs:286 "depois da saída, a coleta NÃO recria o vínculo enquanto a origem seguir mostrando"; duas_afirmacoes_test.exs:71 "a tela mostra AS DUAS afirmações, cada uma com a sua origem"
AC5 — segunda saída em vínculo encerrado recusada sem reescrever a data (FR-023) funcional sim saida_declarada_test.exs:168 "a segunda saída não reescreve a data da primeira (FR-023)"; :126 "par sem vínculo vigente é erro, e nunca {:ok, 0}"
AC6 — a linha diz se o fim foi declarado (por quem) ou constatado pela coleta, com a limitação da cadência (FR-022) funcional sim roster_test.exs:301 "fim DECLARADO traz autor e o instante do registro"; :317 "fim constatado pela COLETA vem sem autor, e a tela precisa dizer isso"; :339 registro antigo lê "sem autor"
FR-027 — observação nova após ausência constatada gera vínculo novo (retorno) funcional sim saida_declarada_test.exs:304 "depois de ausência constatada E reobservação, nasce vínculo NOVO — é retorno"
FR-023 — data obrigatória; campo não vem preenchido com hoje; recusa nomeada funcional sim saida_e_equivoco_na_tela_test.exs:57 "o botão abre o formulário sob a linha, e a data vem VAZIA"; :112 "data vazia é recusada pelo SERVIDOR, com a razão" — frase em show.ex:469 "A departure needs a date — the platform does not assume today."
Protótipo — nota "ended, not deleted" no formulário inline funcional (tela) sim saida_e_equivoco_na_tela_test.exs:80 "a nota diz que o vínculo é encerrado, e não apagado"; show.ex:5466
T008 — gravar ended_by_user_id sem end_declared_at recusado pelo banco não funcional sim saida_declarada_test.exs roda verde; a asserção da violação via Repo.update_all está no arquivo (tasks.md T008) — não relida linha a linha nesta avaliação
SC-013 — registrar saída em menos de 1 minuto sem sair da aba não funcional não medido não há cronometragem; o teste saida_e_equivoco_na_tela_test mostra que o ato ocorre no mesmo live em ?tab=structure, o que sustenta "sem sair da aba", não o tempo
SC-012 — 0 linhas removidas não funcional sim saida_declarada_test.exs:82 confere que os vínculos ficam encerrados (não ausentes); contrato contracts/estrutura-da-equipe.md declara que nenhuma função apaga
Caminhos infelizes do ato — vazio, futuro, já encerrado, outro tenant, sem autor funcional sim os cinco têm teste nomeado: saida_declarada_test.exs:126,139,157,168 e isolamento_da_060_test.exs:160 "a saída com a equipe do outro tenant não encerra nada"

Divergência de rótulo, não de critério: tasks.md T015 prometia a frase "the platform does not presume today"; a tela diz "does not assume today". Nenhum FR fixa a palavra. Registrado, não penaliza.

Fase derivada: sro.accepted_deliverable condicionada — todos os critérios funcionais conformes com evidência executada; SC-013 (tempo) não medido. A skill manda: critério sem evidência → não aceito. Proposta ao papel: SC-013 é critério não funcional de usabilidade que exige medição com pessoa; ou o papel o mede numa sessão (menos de um minuto, cronometrado) e o entregável passa a aceito, ou fica não aceito por avaliação incompleta — não por defeito. O agente não escolhe a leitura que fecha o sprint. Fase da tarefa: T008, T014, T015 — segue a decisão sobre SC-013.


D3 — O equívoco: o vínculo que nunca foi, em observado e declarado

Produzido por: T016, T017 · PR #821 Materializa: US4 — O vínculo que nunca foi (P1, atômica) · sem issue

Comando: o mesmo de D2 (saida_declarada_test contém o describe do equívoco; saida_e_equivoco_na_tela_test contém T017) → 54 passed, EXIT=0.

Critério Tipo Conforme Evidência
AC1 — equívoco em vínculo declarado invalida para todo período, com razão, autor e data (FR-024) funcional sim saida_declarada_test.exs:193 "quem tem dois papéis vigentes é invalidado nos dois numa chamada"; roster_test.exs:361 "o equívoco traz razão, autor e instante"
AC2 — equívoco em vínculo observado: sai de toda medida; coleta não recria; tela mostra as duas afirmações (FR-025, FR-026, SC-002) funcional sim vinculo_observado_test.exs:176 describe "o equívoco vale para o vínculo observado, e a coleta não recria (decisão de 2026-09-07)"; duas_afirmacoes_test.exs:122 "declaração de que nunca esteve, com a coleta ainda mostrando"
AC3 — sem razão é recusado (FR-028) funcional sim saida_declarada_test.exs:242 "razão vazia continua recusada, e sem autor também"; saida_e_equivoco_na_tela_test.exs:186 "razão vazia é recusada, e nada é gravado"
AC4 — nunca esteve e saiu em D são textos distintos; nenhuma é "removida" (FR-028) funcional (tela) sim saida_e_equivoco_na_tela_test.exs:148 "o formulário exige razão, e o texto separa equívoco de saída"; duas_afirmacoes_test.exs:92 "a tela NÃO diz que a pessoa simplesmente saiu"; show.ex:5502 "This is not \"left the team\""
AC5 — pessoa que pertenceu e depois teve segundo vínculo invalidado não aparece como nunca esteve (veredito agregado por pessoa) funcional sim, com ressalva discordancia_test.exs roda verde no mesmo comando; roster_test.exs:231 "a pessoa com um vínculo invalidado E um vigente conta como VIGENTE" cobre o agregado no roster. Não localizei asserção nomeada exatamente para "encerrado + invalidado → não é nunca esteve" na discordância — o papel deve pedir ao QA que aponte a linha ou registrar como lacuna de teste
FR-025 — invalidado excluído de toda medida em toda data funcional sim saida_declarada_test.exs:213 "o invalidado não conta em data ALGUMA, nem antes do reconhecimento"; saida_e_equivoco_na_tela_test.exs:169 "registrar o equívoco tira a pessoa de TODA data"
Protótipo — nota inteira ("applies to declared and observed alike", "the next collection does not re-create") funcional (tela) sim show.ex:5503-5506 traz as duas frases; saida_e_equivoco_na_tela_test.exs:148 confere o texto
FR-006 — quem não gere não vê Mistake… e o evento direto é recusado funcional sim saida_e_equivoco_na_tela_test.exs:232 "lê a lista inteira e não vê os botões"; :240 "o evento disparado direto é recusado, e nada muda"
Caminhos infelizes — razão vazia, par sem vigente, outro tenant funcional sim saida_declarada_test.exs:242,271; isolamento_da_060_test.exs:176 "o equívoco com a equipe do outro tenant não invalida nada"
SC-012 — 0 linhas removidas não funcional sim invalidação é marca (saida_declarada_test.exs:193 lê os dois vínculos depois)

Fase derivada: sro.accepted_deliverable — todos os critérios com evidência executada; a ressalva do AC5 é de localização da asserção, não de comportamento observado errado. Se o papel preferir a leitura estrita (asserção não nomeada = sem evidência), a fase vira sro.not_accepted_deliverable por avaliação incompleta — o agente registra as duas leituras e não escolhe. Fase da tarefa: T016, T017 — sro.successfully_performed_scrum_development_task, sob a mesma ressalva.


D4 — Declarar e alterar o papel na linha, e o lote por vínculo

Produzido por: T018, T019, T020 · PR #821 Materializa: US2 — Declarar o papel de quem a origem mostra, e alterá-lo (P1, atômica) · sem issue

Comando: MIX_ENV=test mix test test/the_band/ontology/seon/eo/declarar_e_alterar_papel_test.exs test/the_band_web/live/declarar_papel_na_linha_test.exs test/the_band_web/live/promocao_na_tela_test.exs test/the_band_web/live/papel_declarado_test.exs test/the_band_web/live/papeis_na_estrutura_test.exs → 72 passed, 0 failures, EXIT=0 (log scratchpad/us2-us5-run.log).

Critério Tipo Conforme Evidência
AC1 — declarar em vínculo observado completa o mesmo vínculo; início fica desconhecido; linha diz declarado (FR-015, FR-016) funcional sim declarar_e_alterar_papel_test.exs:68 "num vínculo OBSERVADO, completa o mesmo vínculo — mesmo id"; :108 "início vazio FICA vazio, e nunca vira hoje"; declarar_papel_na_linha_test.exs:132 idem na tela
AC2 — alterar deixa o anterior com período e o novo vigente; lista mostra o vigente com acesso ao histórico (FR-017) funcional parcial dois registros: declarar_e_alterar_papel_test.exs:241; na tela: declarar_papel_na_linha_test.exs:326 "encerra o antigo e abre o novo na mesma data". "Acesso ao histórico" e "a tela diz se vale da data informada ou de hoje" não têm asserção nomeada — não medido nesta avaliação
AC3 — segundo papel simultâneo aceito e exibido ao lado (FR-018) funcional sim declarar_e_alterar_papel_test.exs:138; declarar_papel_na_linha_test.exs:218 "com dois papéis, há dois botões Change"; :268 "trocar UM papel deixa o outro intacto"
AC4 — novo papel… abre o formulário sem sair da linha e o criado já está selecionável (FR-034) funcional sim declarar_papel_na_linha_test.exs:172 "'+ new role…' cria o papel e declara, sem sair da linha (FR-034)"
AC5 — início em branco nunca vira hoje (FR-016) funcional sim declarar_papel_na_linha_test.exs:115 "a data 'since' vem VAZIA, e o texto diz o que vazio significa"; declarar_e_alterar_papel_test.exs:108
FR-014 — lote na Estrutura, mesmo comando, dizendo quantas linhas foram puladas funcional sim, com ressalva promocao_na_tela_test.exs roda verde em ?tab=structure (describes "a seção de promoção", "a data de início", "confirmar todas"); a contagem de "puladas" não foi conferida por nome
FR-006 — quem não gere não vê o botão; evento direto recusado funcional sim declarar_papel_na_linha_test.exs:386,393; sonda [LEITOR promover] → recusa nomeada "Your account is not linked to a person yet, and managing a team's structure is granted to organisational roles."
Caminhos infelizes — mesmo papel, papel de outra organização, conceito fora do catálogo, vínculo encerrado, outro tenant, sem nome, sem escolher funcional sim declarar_e_alterar_papel_test.exs:165,187,225,315,331,353; declarar_papel_na_linha_test.exs:154,199,351 — todos devolvem recusa nomeada, nenhum levanta
SC-012 — 0 linhas removidas não funcional sim declarar_e_alterar_papel_test.exs:241 lê os dois registros depois da troca
Protótipo — Declare role na linha; formulário inline; "+ new role…" no seletor funcional (tela) sim declarar_papel_na_linha_test.exs:74,102; show.ex:5181,5390

Fase derivada: sro.not_accepted_deliverable por avaliação incompleta — AC2 tem duas partes sem evidência ("acesso ao histórico" na lista; a tela dizer "da data informada ou de hoje"). Não há comportamento errado observado. Alternativa para o papel: se aceitar que o histórico é o vínculo encerrado permanecendo na linha (o roster lista todos os vínculos da pessoa — roster_test.exs:167,231), AC2 passa a conforme e a fase vira aceito. Não escolho. Fase da tarefa: T018 — sucesso (todos os seus critérios conformes); T019/T020 — seguem a decisão sobre AC2.


D5 — Os papéis da organização, a partir da Estrutura

Produzido por: T021, T022 · PR #821 Materializa: US5 — Criar o papel da organização a partir da estrutura (P1, atômica) · sem issue

Comando: o mesmo de D4 → 72 passed, EXIT=0. Nota: tasks.md T021 prometia roster_test.exs — describe "contagem por papel"; a asserção vive em papeis_na_estrutura_test.exs:79-108. Mudou de arquivo, existe.

Critério Tipo Conforme Evidência
AC1 — criar com nome e código: existe para a organização, com autor e data; aparece no seletor desta e de qualquer equipe e em /roles (FR-030) funcional parcial /roles: papeis_na_estrutura_test.exs:143 "criar aqui aparece em /roles — é o MESMO papel (SC-005)"; seletor desta equipe: declarar_papel_na_linha_test.exs:172. Seletor de OUTRA equipe da organização (SC-005) não tem asserção — não medido
AC2 — código repetido na mesma organização recusado; em outra não é conflito (FR-031) funcional sim papeis_na_estrutura_test.exs:160,169
AC3 — remover papel em uso recusado dizendo quantos (FR-033) funcional sim papeis_na_estrutura_test.exs:205 "ocultar papel COM vínculo vigente é recusado, dizendo quantos"
AC4 — catálogo SRO marcado, sem remover, com contagem aqui e na organização (FR-029) funcional sim :63 "traz catálogo e criados, com origem e código"; :234 "papel do CATÁLOGO não oferece renomear nem ocultar"; :79,95 contagem de pessoas distintas
AC5 — renomear preserva os vínculos (FR-032) funcional sim :183 "renomear mantém os vínculos apontando para o mesmo papel"
AC6 — código sugerido e editável (FR-031) funcional sim :123 "o código é sugerido do nome"; :131 "o código editado NÃO é sobrescrito pela sugestão"
FR-081 — a seção Papéis mostra quais papéis carregam a concessão gerir estrutura (leitura) funcional não medido nenhuma asserção nomeada localizada em papeis_na_estrutura_test.exs; tasks.md T022 lista a coluna grants — não conferida na tela
FR-006 — quem não gere lê e não age funcional sim :260 "vê a tabela e nenhum botão nem formulário"; :270 "o evento de criar é recusado"; sonda [LEITOR criar_papel] recusado com motivo
FR-005 — isolamento: contagens e código de outro tenant não funcional sim isolamento_da_060_test.exs:109,113
SC-012 — ocultar é marca, não apaga não funcional sim :219 "ocultar papel sem ninguém funciona, e é MARCA — não apaga"
Protótipo — Roles (catálogo + criados; "New role" nome e código; renomear; remover só sem vínculo) funcional (tela) sim, com decisão pendente rótulo do botão: protótipo diz "remover", spec FR-033 diz "ocultar", tasks T022 propõe Hide como pergunta aberta 1 — decisão do papel/Design pendente, não é defeito da implementação

Fase derivada: sro.not_accepted_deliverable por avaliação incompleta — AC1 (seletor de outra equipe) e FR-081 (coluna de concessões) sem evidência. Nenhum defeito observado. Fase da tarefa: T021 — sucesso; T022 — não sucesso enquanto FR-081 e a parte de SC-005 não forem medidos.


D6 — O fluxo da equipe inteira em três granulações, e o gráfico pequeno no cartão

Produzido por: T026, T027, T028, T029 · PR #821 — o corpo do #821 cita T026, T028 e T029. O PR #860 não é desta US: entrega a aba Flow per person (extensão spec-graficos-por-membro.md, US10–US12), fora das seis avaliadas. Materializa: US9 — O fluxo da equipe inteira: burn, Prometido × Entregue, Monte Carlo (P3, atômica) · sem issue

Comando: MIX_ENV=test mix test test/the_band/work_items/fluxo_da_equipe_test.exs test/the_band_web/live/equipe_composta_test.exs test/the_band_web/live/fluxo_na_tela_test.exs → 41 passed, 0 failures, EXIT=0 (log scratchpad/us9-run.log).

Critério Tipo Conforme Evidência
AC1 — burn-up/down da equipe inteira, partindo dos já abertos, região entre curvas, texto "não é a soma" (FR-056, FR-059, FR-060) funcional sim fluxo_da_equipe_test.exs:178 "mede o trabalho de quem está nas SUBEQUIPES"; :248 "a mesma pessoa em DUAS partes conta uma vez no todo (FR-060)"; equipe_composta_test.exs:151 "a tela diz por que não soma"; show.ex:2941 "not the sum"
AC2 — trocar granulação reagrupa os mesmos itens; somas iguais nas três (FR-061) funcional sim fluxo_da_equipe_test.exs:109 "a soma de abertos e de fechados é igual em semana, mês e ano"; fluxo_na_tela_test.exs:156 granulação inexistente desenha semana e avisa
AC3 — Prometido × Entregue com definição junto do título e "não há escopo comprometido" (FR-062, FR-063) funcional sim fluxo_na_tela_test.exs:366 "a palavra 'promised' nunca aparece sem a definição operacional ao lado"; :389 fechado é ato da ferramenta; show.ex:1600-1601
AC4 — Monte Carlo semanal independentemente da granulação, duas hipóteses, confiança, proporção que não concluiu (FR-064) funcional parcial duas hipóteses: fluxo_na_tela_test.exs:327 "desenha as duas hipóteses na MESMA régua"; proporção: :338 "runs that never reached zero". "Semanal independentemente da granulação, e a tela diz isso": nenhuma asserção; grep -i weekly|regardless em show.ex devolve só "closed per week —" (:3088) — não medido
AC5 — abaixo do piso nenhuma previsão, e a tela diz o que falta funcional sim fluxo_na_tela_test.exs:316 "sem histórico não há gráfico, e a tela diz o que falta"
AC6 — previsão idêntica em duas consultas (057 FR-036, SC-014) funcional sim, por herança coberto em test/the_band/forecast_test.exs (feature 057), não reexecutado aqui; CI 34779226200 verde
AC7 — cada cartão de subequipe traz o gráfico pequeno e é porta para o Dashboard dela (FR-041, FR-084) funcional sim equipe_composta_test.exs:159 "FR-041/FR-084: cada subequipe é um CARTÃO, com faísca, e o cartão é porta" + asserção de que a tabela não tem <svg>
SC-009 — distância entre as curvas em qualquer ponto = itens em aberto naquele ponto, nas três granulações não funcional não medido nenhuma asserção nomeada em fluxo_da_equipe_test.exs nem em fluxo_na_tela_test.exs (busca por "distância", "aberto naquele ponto", "open_at"); T028 prometia provar exatamente isto
FR-078 — janela padrão por granulação (8 sem / 12 meses / todos os anos), no título e na URL funcional sim fluxo_na_tela_test.exs:170,186; fluxo_da_equipe_test.exs:331 "primeira_atividade devolve a abertura mais antiga da equipe"; :197,205 período absurdo/zero cai no padrão
SC-008 — nenhuma célula de total; declaração de que não é soma não funcional sim equipe_composta_test.exs:151; 057 SC-003 herdado
Protótipo — Squads at a glance: três números members / open / stopped e a mistura de conceitos TASK n · US n · BUG n · EPIC n abaixo deles funcional (tela) não o próprio tasks.md T029 registra: "os três números do cartão divergem do protótipo (open items/median wait/pipeline contra members/open/stopped), falta a mistura de conceitos, e a matiz por subequipe é decisão de Design pendente". Divergência de protótipo é defeito (regra da casa: a tela implementada é exatamente a aprovada)
Protótipo — burn escreve a identidade open(t) = base + opened − closed, e a linha de base funcional (tela) sim, com ressalva fluxo_na_tela_test.exs:229,248,302 (valores, horizonte com ressalva); o corpo do PR #860 cita "a identidade sem o aberto inicial" como item corrigido lá — o PR #860 está fora desta US, mas a correção está em 0ccf02b
Protótipo — Delivery forecast: dois histogramas no mesmo eixo, coluna hachurada do "never" separada funcional (tela) sim fluxo_na_tela_test.exs:327,346-348 (">never<" separada das semanas); :351 descrição textual com os números
Processo — PR com revisor pedido e no projeto processo não #821: revisor pedido à equipe the-band, nenhuma review registrada, não ligado ao projeto (projectItems = [])

Fase derivada: sro.not_accepted_deliverable — falha em critério de tela observado (o cartão diverge do protótipo aprovado, por confissão do próprio tasks.md), além de SC-009 e da metade de AC4 sem evidência. Fase da tarefa: T026, T027 — sucesso pelos seus critérios; T028 — não sucesso (SC-009 prometido e não provado); T029 — não sucesso (cartão fora do protótipo). O que faltou: o cartão com os três números do protótipo e a mistura de conceitos; a asserção da distância entre curvas; a frase de que a previsão é semanal seja qual for a granulação. Destino proposto da US9: nova tarefa pretendida ligada à US9 (nunca reabrir T028/T029) para (1) o cartão conforme o protótipo — passa antes pelo Design, porque median wait por subequipe exige consulta agrupada que não existe e a matiz por subequipe é decisão pendente (T029, L67); (2) a asserção SC-009; (3) a frase de FR-064. Entra no próximo sprint backlog, em primeiro lugar, como herança.


Resumo

Quantidade
Entregáveis avaliados 6
Aceitos (proposta) 1 (D3 — US4)
Não aceitos por defeito observado 1 (D6 — US9: cartão fora do protótipo)
Não aceitos por avaliação incompleta (critério sem evidência) 3 (D2 — US3: SC-013; D4 — US2: AC2; D5 — US5: AC1/SC-005 outra equipe, FR-081)
Não aceitos por critério de processo (constituição XI: teste prometido ausente) 1 (D1 — US1)
Tarefas executadas com sucesso 17 — T001–T009, T013, T014, T016, T017, T018, T021, T024, T026, T027
Tarefas executadas sem sucesso 9 — T010, T011, T012 (teste ausente); T015 e T019/T020 e T022 (seguem a decisão sobre o critério não medido); T028, T029
Tarefas não avaliadas T023, T025 (fechamento; FR-052 é da US7)
US Veredito proposto Critérios medidos Conformes Não conformes Não medidos Destino proposto
US1 sro.not_accepted_deliverable (processo XI) 16 13 2 (teste prometido ausente; PR sem review/projeto) 1 (FR-004 "composta de K") nova tarefa pretendida: escrever abas_da_equipe_test, estrutura_membros_test, estrutura_permissao_test (três motivos × evento, incluindo promover) — a sonda é o esqueleto; próximo sprint, em primeiro lugar. O valor entregue permanece em produção
US3 sro.not_accepted_deliverable (incompleta) 13 12 0 1 (SC-013, tempo < 1 min) medir na confirmação: o papel cronometra a saída em ?tab=structure; conforme → aceito sem tarefa nova
US4 sro.accepted_deliverable 10 10 0 0 (AC5 com ressalva de localização da asserção) concluída; pedir ao QA a linha da asserção "encerrado + invalidado ≠ nunca esteve" ou registrar lacuna de teste
US2 sro.not_accepted_deliverable (incompleta) 10 9 0 1 (AC2: histórico acessível na lista; tela diz "da data informada ou de hoje") decisão do papel: se o vínculo encerrado na linha vale como histórico, aceito; senão, nova tarefa para a asserção e o texto de FR-017
US5 sro.not_accepted_deliverable (incompleta) 11 9 0 2 (SC-005 seletor de outra equipe; FR-081 coluna de concessões) medir: sonda em segunda equipe da mesma organização + leitura da seção Roles; se conformes → aceito; senão, nova tarefa
US9 sro.not_accepted_deliverable (defeito) 14 9 2 (cartão ≠ protótipo; PR sem review/projeto) 3 (AC4 "semanal seja qual for a granulação" dito na tela; SC-009 distância entre curvas; AC6 só por herança da 057) nova tarefa pretendida ligada à US9: cartão Squads at a glance conforme o protótipo (members/open/stopped + mistura de conceitos) — passa pelo Design antes, porque median wait por subequipe e a matiz são decisões abertas (T029, L67); asserção SC-009; frase de FR-064. Próximo sprint, como herança

Entregável do sprint (sro.sprint_deliverable): compõe-se só de aceitos. Na proposta como está, apenas D3 (US4) o integra. Se o papel medir SC-013 e decidir AC2/FR-081/SC-005 na confirmação, D2, D4 e D5 podem entrar no mesmo ato.

Defeitos observados (comportamento errado ou fora do aprovado)

# Onde O que Critério Fonte
1 Dashboard da equipe composta, cartão Squads at a glance três números open items / median wait / pipeline em vez de members / open / stopped; falta a mistura de conceitos TASK n · US n · BUG n · EPIC n protótipo §3 (2026-09-08); FR-084; regra da casa "tela implementada = tela aprovada" tasks.md T029, "Aberto ainda" — o próprio registro da tarefa confessa e marca [x]
2 tasks.md T010, T011, T012 marcadas [x] sem o teste prometido existir constituição XI busca por nome e por conteúdo em test/
3 PR #860 mergeado sem revisor pedido (reviewRequests=[]) "todo PR nasce com revisor pedido" gh pr view 860
4 PRs #819, #821, #860 fora do projeto (projectItems=[]); #817 no projeto com Iteration=null "ligado ao projeto, com Iteration e Status" gh pr view --json projectItems

Nenhum caminho infeliz exercitado levantou exceção: todos os eventos recusados devolveram flash com motivo nomeado (sonda, quatro eventos; testes de recusa nos seis arquivos de domínio).

Critérios alterados durante o sprint

Não há sprint backlog do 030 para comparar. Emenda declarada antes desta avaliação e fora da 060: FR-085 (spec-graficos-por-membro.md, 2026-09-08) acrescenta a terceira aba ?tab=people ao parâmetro da FR-001 — a tela tem três abas e isto é conforme à emenda, não à FR-001 literal. Registrado; não penaliza.

Critérios sem evidência

Critério US O que falta para medir
SC-013 — saída registrada em < 1 min sem sair da aba US3 cronometrar uma sessão real; nenhum teste mede tempo
AC2 (parte) — "a lista mostra o vigente com acesso ao histórico"; tela diz "da data informada ou de hoje" (FR-017) US2 asserção sobre a linha depois de change_role; leitura do texto do formulário
SC-005 (parte) — papel criado aparece no seletor de outra equipe da organização US5 sonda com duas equipes na mesma organização
FR-081 — seção Roles mostra quais papéis carregam a concessão US5 asserção sobre a coluna grants
FR-004 (parte) — "composta de K subequipes" no cabeçalho US1 asserção nomeada em equipe_composta_test ou sonda com partes
FR-064 (parte) — a tela diz que a previsão é semanal seja qual for a granulação US9 texto não localizado em show.ex; asserção inexistente
SC-009 — distância entre curvas = aberto naquele ponto, nas três granulações US9 asserção prometida em T028 e não escrita
AC6 — previsão idêntica em duas consultas US9 reexecutar test/the_band/forecast_test.exs (057) — não rodado nesta avaliação

Lacunas de processo

  1. Sem issue para nenhuma US nem tarefa da 060; sem sprint backlog do 030 — sro.rule01 não verificável; este registro é retroativo.
  2. Revisão: #817, #819, #821 com revisor pedido à equipe e reviews=[]; #860 sem revisor pedido. Nenhuma das quatro tem revisão registrada. O papel deve classificar cada uma como atestada sem registro (com data e frase) ou não ocorreu.
  3. Projeto: três dos quatro PRs invisíveis ao board; flow.wip.count subcontou o sprint.
  4. tasks.md marca [x] o que não tem teste (T010–T012) e o que confessa divergir do protótipo (T029) — marcação manual de "feito", exatamente o que sro.rule03 proíbe para aceitação.
  5. PR #860 atribuído nesta avaliação a T026–T029 pelo pedido — o corpo do #821 é que cita T026, T028, T029; o #860 entrega a aba Flow per person (US10–US12), que não foi avaliada aqui e precisa de registro próprio.
  6. Tipo de PO: sro.product_owner_client; decisão final é de quem demanda.

Comandos e logs desta avaliação

Rodada Comando (todos em MIX_ENV=test, 0ccf02b) Resultado Log
US1 mix test roster_test teto_de_consultas_da_equipe_test duas_afirmacoes_test estado_na_url_test isolamento_da_060_test gerir_estrutura_test 65 passed, EXIT=0 scratchpad/us1-run.log
US3+US4 mix test saida_declarada_test vinculo_observado_test saida_e_equivoco_na_tela_test discordancia_test team_membership_test 54 passed, EXIT=0 scratchpad/us3-us4-run.log
US2+US5 mix test declarar_e_alterar_papel_test declarar_papel_na_linha_test promocao_na_tela_test papel_declarado_test papeis_na_estrutura_test 72 passed, EXIT=0 scratchpad/us2-us5-run.log
US9 mix test fluxo_da_equipe_test equipe_composta_test fluxo_na_tela_test 41 passed, EXIT=0 scratchpad/us9-run.log
Sonda de tela mix test scratchpad/sonda_060b_test.exs --seed 0 3 passed, EXIT=0 scratchpad/sonda-run.log
Suíte inteira e gates não rodados aqui — CI run 34779226200 sobre 0ccf02b: success — GitHub Actions

Parte B — a herança (045 e 055)

PROPOSTA DO AGENTE — confirmação pela pessoa alocada ao papel PENDENTE. Nada abaixo é aceitação consumada: é a avaliação critério a critério, com a evidência executada nesta sessão, para que sro.product_owner confirme ou recuse cada fase derivada.

Features: 045-autenticacao-e-acesso · 055-equipes-declaradas Avaliado em: 2026-09-14, na development em 0ccf02b (limpa), sem checkout nem edição. Evidência executada: mix test <arquivos> com código de saída, leitura de migração e de código, git show do branch do protótipo, API do GitHub para PRs e issues. Gates e suíte inteira não rodados aqui — a run do CI 34779226200 sobre 0ccf02b está success. Papel: Product Owner — avaliação proposta pelo agente; confirmação pendente. Tipo de PO: sro.product_owner_client — quem demanda é quem mantém.

Três invariantes de processo atravessam os três entregáveis, e são registradas uma vez aqui:

Invariante #853 (H1) #863 (H2) #857 (H3)
revisão pedida (timeline: review_requested) nunca pedida nunca pedida nunca pedida
revisão registrada (pulls/<n>/reviews) 0 0 0
issue fechada pelo PR (closingIssuesReferences) nenhuma nenhuma nenhuma
item em sprint backlog (sro.rule01) docs/sprints/030* não existe ainda idem idem

Classificação da revisão, pela regra da casa: revisão não ocorreu — não há registro e não há pedido; e não é possível pedir revisão de PR mergeado. A skill diz "não aceite entregável cuja revisão nunca foi pedida"; a v0.7.0 e a v0.8.0 trataram a mesma lacuna como exceção de release decidida pelo papel (21 de 21 PRs). As duas leituras estão registradas; a escolha é do papel, e este documento não a faz. O rule01 fecha no ato do registro retroativo do sprint 030 — que é o que este documento alimenta — desde que o sprint-backlog.md liste os três como herança.


H1 — D06 da v0.7.0, reavaliado: a conta desativada como o protótipo pediu

Produzido por: PR #853, mergeado 2026-09-10T14:15Z em development · sem issue (closingIssuesReferences: []; as 18 issues fechadas que casam "045" são T001–T014, US1–US3 e 047/T005 — nenhuma trata da conta desativada) Migração: 20260910050000_episodio_de_desativacao.exs — cria account_disablements (razão e nota nas duas pontas, disable_reason NOT NULL), índice único parcial account_disablements_aberto_index (um episódio aberto por conta), backfill com not_recorded, e users.password_source / users.password_set_by_user_id. Materializa: FR-025 a FR-029 da spec 045 (escritos no mesmo PR, formalizando os critérios que o item de backlog docs/backlog/conta-desativada.md já carregava desde 2026-09-09). A 045 tem três user stories (US1 entrar, US2 escopos, US3 perfil) e nenhuma delas menciona desativação: o entregável materializa requisito sem user story atômica declarada. Lacuna registrada, não batizada. Protótipo: specs/045-autenticacao-e-acesso/prototipo/ — PROMPT.md (§3 é a régua), README.md (11 decisões, 4 perguntas fechadas pelas recomendações), accounts-disable.html. Aprovação: README, "a pessoa mantenedora respondeu 'pode implementar'" (2026-09-10). Protótipo e código entraram no mesmo PR — a ordem protótipo → aprovação → código não é demonstrável pelo histórico do repositório, só pelo texto do README e do item de backlog. Evidência executada: mix test test/the_band/tenants/conta_desativada_test.exs test/the_band_web/live/accounts_test.exs test/the_band_web/live/accounts_elo_test.exs → 32 passed, EXIT=0 (2026-09-14 18:53).

Os critérios que o D06 recusou, um a um, contra a evidência nova

Critério (tal como no D06) Tipo D06 Agora Evidência
o registro diz quem, quando e POR QUÊ; nada é apagado funcional NÃO sim disable_user/4 exige mapa de razão; AccountDisablement.abrir_changeset validate_required [.., :disable_reason] + validate_inclusion contra AccountLifecycle.codigos_de_desativacao(); testes :232 "desativar EXIGE razão, e a razão fica escrita na linha", :250 "a nota é obrigatória para suspeita de comprometimento"; coluna disable_reason NOT NULL na migração
reativar é ato registrado, com autor e razão funcional NÃO sim enable_user/4 (tenant, id, ator, razão); fechar_changeset validate_required [:enabled_by_user_id, :enable_reason]; teste :305 "reativar fecha o episódio e NÃO apaga a desativação"; :367 "duas desativações caem no registro, e o par de colunas cabia uma"
roster, medidas e histórico da pessoa não mudam não funcional sem evidência sim, com ressalva :407 compara antes/depois length(EO.list_people), concessões vigentes, person_id/person_revoked_at e password_hash, com guarda contra zero. Nenhuma medida computada da pessoa é comparada; para "medidas" a evidência é indireta — o ato escreve só em users e account_disablements (desativar_na_transacao). O item de backlog relata mutação (revogação injetada no desativar → teste reprovou)
Parte C — o texto do revoke diz que não remove acesso funcional NÃO sim accounts_live/index.ex:867 nao_faz="Does not remove access. Signing in by e-mail does not need the link..."; :1492 data-confirm="... It does NOT remove access ..."; teste :448 asserta "Does not remove access"
Parte C — teste que reprova se revogar voltar a ser o único ato não funcional NÃO sim :448 "revogar o elo NÃO é o único ato oferecido a quem desliga" — asserta "Removing someone's access" e "Disable account"
conta desativada não autentica por token funcional n/a não avaliável o token não existe (spec 061 sem código). A tela escreve "the platform has none yet" como promessa. Continua critério que não se pode medir — não conta como conforme

Os demais seis critérios do D06 (recusa idêntica :60; gira token de sessão :99, :121; distinção sem cor :197; ato próprio nomeado :448; não a si / outro tenant / duas vezes :130, :139, :153; reativar não devolve a senha :162, :178) continuam conformes na mesma execução.

Os três achados fora da tabela do D06

Achado Agora Evidência
a tela mudou sem protótipo aprovado fechado, com ressalva protótipo existe, com PROMPT/README/HTML; aprovação registrada no README e em docs/backlog/conta-desativada.md. Ressalva: mesmo PR que o código; e a conferência item a item do QA com captura da tela real não foi encontrada — a régua §3 tem 7 seções e 6 linhas de tabela, e a evidência aqui é a presença dos textos (20 de 21 termos da §3 em index.ex; from a reset vem do rótulo da base e aparece no HTML renderizado, :208, :226)
quatro decisões tomadas pelo código fechado decisão 1 migrou para a recomendação (b) — relator próprio account_disablements; perguntas 12–15 fechadas pelas recomendações depois do "pode implementar", registradas no README com onde cada uma vive
sro.rule01 — sem sprint backlog, sem tarefa, sem issue continua aberto #853 sem issue; docs/sprints/030* não existe. Fecha com o backlog retroativo listando este item como herança

Os critérios que a spec passou a carregar (FR-025 a FR-029), e o que deles foi medido

Critério Tipo Conforme Evidência
FR-025 razão de lista fechada, vinda de access.account_lifecycle funcional sim AccountLifecycle lê KnowledgeBase.rule("access.account_lifecycle"), sem lista escrita no módulo; :232
FR-025 sem vocabulário declarado, o ato recusa e não grava vazio funcional sem evidência executada disable_user/4 tem vocabulario_declarado() → :vocabulario_nao_declarado; nenhum teste em test/ exercita a base ausente (grep vocabulario_nao_declarado test/ vazio). Leitura de código não é evidência
FR-025 nota obrigatória só para suspected_compromise e other funcional sim :250; exige_nota lê note_required.on_disable da base
FR-025 onde a nota é omitida, o registro escreve a frase de ausência, nunca célula vazia funcional sem evidência executada frase_sem_nota/0 ("no note") usada em index.ex (2 ocorrências); nenhuma asserção de teste encontrada
FR-026 ator e razão ao reativar; a desativação não é apagada funcional sim :305, :367
FR-026 um episódio aberto por conta, por índice único parcial funcional sim migração account_disablements_aberto_index where enabled_at IS NULL; unique_constraint em abrir_changeset:82; :367
FR-026 disabled_at e episódio na mesma transação não funcional não medido Repo.transaction + Repo.rollback em desativar_na_transacao e reativar_na_transacao (leitura); nenhum teste injeta falha do segundo passo — exatamente o teste que o H3 tem e este não
FR-026 disabled_by_mistake marca o episódio, deixa de contar, continua visível funcional sim :324 "o equívoco é dito, e para de contar como desligamento"; resumir/1 exclui equívocos de desligamentos
FR-026 investigation_closed_no_compromise só contra suspected_compromise, recusado pelo domínio funcional sim :340; account_disablement.ex:155 abertura_exigida_pela_reativacao/1
FR-027 dois vocabulários, duas colunas (Account · Sign-in credential) funcional sim :197
FR-027 as duas temporárias distinguidas em palavras funcional sim :208 asserta temporary · from a reset; :221 refuta from creation na linha; password_source/password_set_by_user_id na migração
FR-027 proveniência não registrada dita como temporary_source_not_recorded funcional sem evidência executada not recorded em index.ex (2 ocorrências); nenhuma asserção de teste encontrada
FR-028 ação recusada fica na tela, inerte, com a razão funcional sim :268 (reset na desativada), :288 (desativar a si)
FR-028 conta desativada não filtrada por omissão funcional sim :197 renderiza /accounts sem filtro e a linha desativada aparece; cabeçalho "disabled last, and never hidden" em index.ex
FR-029 o procedimento (três atos, faz / não faz) na tela funcional sim :448; what it does not do ×3 em index.ex
FR-029 o revoke diz que não remove acesso funcional sim :867, :1492, :448

Fase derivada: sro.not_accepted_deliverable — por avaliação incompleta, não por comportamento errado: os cinco pontos que o D06 recusou estão fechados com evidência executada (quatro NÃO → sim; um sem evidência → sim com ressalva), o protótipo existe e as quatro decisões estão registradas. O que impede a aceitação hoje são três cláusulas dos FRs sem teste (vocabulário ausente recusa; frase de ausência de nota; temporary_source_not_recorded), a invariante da transação não medida (sem teste de falha injetada), a conferência do QA item a item não encontrada, e o rule01 em aberto até o backlog retroativo. A lacuna de revisão pesa conforme a leitura que o papel escolher (ver cabeçalho). Fase da tarefa: sro.non_successfully_performed_scrum_development_task — e não há tarefa pretendida à qual ligá-la (sem issue, sem tasks.md): a fase é do trabalho, e o trabalho não tem registro de intenção. O que fecha: quatro testes (base ausente → {:error, :vocabulario_nao_declarado}; "no note" na linha; "not recorded" na credencial antiga; falha injetada em Repo.insert do episódio → users.disabled_at continua nulo), a conferência §3 item a item com captura, e a linha de herança no sprint-backlog.md do 030. Nenhum deles é desenho: é prova. Destino: entra no sprint 030 como herança, nova tarefa pretendida (nunca reabrir o #853), ligada a uma user story que a 045 ainda precisa declarar — "quem administra desativa e reativa contas, e o registro diz quem, quando e por quê" não tem US na spec.


H3 — Declarar equipe dentro de outra é UM ato, numa transação

Produzido por: PR #857, mergeado 2026-09-11T14:52Z em development · sem issue (closingIssuesReferences: []) Materializa: 055/US3 — Equipe dentro de equipe (P2), FR-008; e a invariante achada em 2026-09-10 (a equipe ficava criada e solta quando compose_teams/4 falhava depois de declare_structural_team/4). Evidência executada: mix test test/the_band/ontology/seon/eo/team_composition_test.exs test/the_band_web/live/subequipe_test.exs (rodados junto dos de H2) → 72 passed, EXIT=0 (2026-09-14). Um aviso de compilação em subequipe_test.exs:81 (forma de live/2 apontada pela documentação do Phoenix.LiveViewTest) — aviso, não falha.

Critério Tipo Conforme Evidência
os dois passos (criar a equipe, compô-la na mãe) acontecem numa transação não funcional sim commands.ex:374 declare_subteam/4: Repo.transaction(fn -> with {:ok, filha} <- declare_structural_team(...), {:ok, _} <- compose_teams(...) do filha else {:error, motivo} -> Repo.rollback(motivo) end end); teams_live/show.ex:201-222 o handler criar_subequipe chama só EO.declare_subteam/4 — a invariante mora no domínio, não no chamador
teste que injeta a falha do segundo passo e prova que o primeiro não fica não funcional sim team_composition_test.exs:106 "se a composição falha, a equipe NÃO fica criada e solta": mãe com id inexistente (o organization_id é válido, logo o primeiro passo passa e o segundo bate na FK whole_team_id); compara length(EO.list_teams) antes/depois e refuta o nome "Squad Órfã". Rodado: passa
a falha é recusa, não queda funcional sim :91 "a falha é RECUSA, e não queda" — {:error, motivo} com is_binary(motivo); antes das foreign_key_constraint/2 levantava Ecto.ConstraintError
os oito caminhos infelizes recusam e nenhum levanta funcional sim :146-:210 — tabela iterada + :210 "NENHUM dos oito caminhos levanta"; :185 autor inexistente, :192 organização inexistente, :199 mãe sem organização
o limite de tamanho chega interpolado, não como %{count} funcional sim :172
a subequipe herda a organização da mãe; a tela nomeia a equipe criada funcional sim :72; subequipe_test.exs:48, :155
pela tela, a recusa não cria nada e o caminho feliz segue na mesma vista funcional sim subequipe_test.exs:104 (tabela de recusas), :119 "a recusa NÃO cria nada", :132
o nome é aparado, e a duplicata sob a mesma normalização é recusada funcional sim subequipe_test.exs:60; team_composition_test.exs:251 "a mesma composição duas vezes é recusada"
sem escopo, não declara funcional sim subequipe_test.exs:193

Fase derivada: sro.accepted_deliverable — todos os critérios conformes, com evidência executada nesta sessão. As duas perguntas do pedido têm resposta direta: sim, há Repo.transaction cobrindo os dois passos (e Repo.rollback no else); sim, há teste que injeta a falha do segundo passo e prova que o primeiro não fica, e ele passa. Fase da tarefa: sro.successfully_performed_scrum_development_task — sem tarefa pretendida registrada (sem issue); a fase é do trabalho. Condicionantes fora dos critérios (ver cabeçalho): revisão nunca pedida e não registrada; rule01 fecha com a linha de herança no sprint-backlog.md do 030.


H2 — FR-003 da 055 ganha tela: vincular pessoa a equipe, com o veredito antes do botão

Produzido por: PR #863, mergeado 2026-09-12T19:25Z em development · sem issue (closingIssuesReferences: []). A user story 055/US2 (#703) foi fechada em 2026-09-02, dez dias antes de a FR-003 ter tela. Materializa: 055/US2 — A pessoa entra, sai, e o que ela fez continua lá (P1), pela FR-003 (cláusula MUST + emenda de 2026-09-06: "vincular do zero continua existindo para quem a origem não mostra"), cenários AC1 e AC5. AC2–AC4 (saída, equívoco, novo período) pertencem a FR-004/006 e não são objeto deste entregável. Protótipo: specs/055-equipes-declaradas/prototipo/ — PROMPT.md (§3 é "a régua do QA"), README.md, team-declared-link.html; artifact https://claude.ai/code/artifact/9645056b-9f3d-4a8a-88bf-81c09fac15d8. Os três arquivos entraram no próprio #863, junto do código; o PR #915 (aberto 2026-09-13, branch design/055-vinculo-declarado-prototipo) traz os mesmos três arquivos com conteúdo idêntico ao da development (git diff --stat origin/development origin/design/055-vinculo-declarado-prototipo -- specs/055-equipes-declaradas/prototipo/ vazio) — é republicação de algo já mergeado, não protótipo novo. O que o registro diz sobre a aprovação: o README.md — nas duas cópias — declara Aprovação: aguardando a pessoa mantenedora — três perguntas abertas, duas delas mudam o que a tela desenha (P1 origem registrada × derivada; P3 coleta sobre vínculo declarado). Nenhuma das três tem Decided. O vinculo_possivel.ex afirma no @moduledoc "protótipo aprovado em 2026-09-11". As duas afirmações não podem ser ambas verdadeiras; registro como está. Registro do protótipo no backlog: grep -rl team-declared-link docs/ vazio — nenhum item de docs/backlog/ cita o artifact nem o PROMPT.md. Divergência com o pedido desta avaliação: o pedido diz "papel e data opcionais"; a FR-003 diz "com papel e data de início" e a decisão 3 do protótipo fixa papel obrigatório, data opcional. Avalio contra spec e protótipo. Evidência executada: mix test test/the_band/ontology/seon/eo/vinculo_possivel_test.exs test/the_band_web/live/vincular_pessoa_test.exs test/the_band/ontology/seon/eo/team_membership_test.exs (junto dos de H3) → 72 passed, EXIT=0 (2026-09-14).

Critério Tipo Conforme Evidência
FR-003 — quem administra vincula pessoa a equipe, com papel funcional sim vincular_pessoa_test.exs:234 "declarar cria o vínculo, com papel e sem data"; :205 papel obrigatório; :265 sem papel recusa
FR-003 — com data de início (opcional; vazia fica nula, nunca hoje) funcional sim :218, :253 guarda ~D[2026-01-15]; team_membership_test.exs:43 "data em branco fica NULA"; commands.ex mudança 2 do README aplicada
FR-003 — o vínculo guarda quem o declarou funcional não medido declare_team_membership/5 grava declared_by_user_id: actor_id (commands.ex:69+28, leitura); team_membership.ex:147 valida o par autor/instante. Nenhum teste asserta declared_by_user_id == ator — :234 asserta só papel_declarado? (papel não nulo)
FR-003 emenda — vincular do zero existe para quem a origem não mostra funcional sim veredito 6: vinculo_possivel_test.exs:135, vincular_pessoa_test.exs:183 "é o caso da FR-003"
AC1 — o vínculo passa a valer a partir da data, com quem o declarou funcional parcial data: sim (:253); autor: não medido (linha acima)
AC5 — já vinculada e vigente → recusado com a razão funcional sim veredito 2: vinculo_possivel_test.exs:75, vincular_pessoa_test.exs:129 "RECUSA inerte, e oferece declarar o papel" (FR-007 emendada / FR-014)
os seis vereditos no domínio, na ordem certa, em duas consultas funcional sim vinculo_possivel_test.exs:70-:135 (1–6), :142 ordem (membro e sumiu → recusa), :152 oito resultados = duas consultas, :164 lista vazia não vai ao banco
os seis vereditos na tela, antes do botão (§3.5) funcional parcial tela testa 1 (:119), 2 (:129), 3 (:157), 6 (:183). Vereditos 4 (saiu) e 5 (equívoco) sem teste de renderização — textos a new link e the mistake stays existem em show.ex (1 ocorrência cada), mas não há asserção que os exercite
§3.1 — seção Link a person to this team entre Roles e Members, em repouso fechada tela sim :71, :84; show.ex 1 ocorrência do título
§3.1 item 2 — rótulo N of M collected people are linkable here, N e M da consulta tela não linkable here: 0 ocorrências em show.ex. As medidas que o README exige antes do código (structure.people_linkable_to_team.count, structure.memberships_declared_from_zero.count, structure.people_without_any_team.count) não existem em priv/knowledge_base/ (grep vazio) — princípio IV
§3.2 — escopo escrito, não cria pessoa, busca vazia não é erro tela sim :93, :107; No collected person matches em show.ex
§3.3 — formulário: pessoa escolhida, choose a role…, member since vazio (empty = start unknown), Declare the link, what this creates / What it does not do tela sim :205, :218, :225; textos presentes em show.ex (step 2, choose a role, empty = start unknown, Declare the link, what this creates, What it does not do)
§3.4 — lista de membros com a coluna link corrigida (no source shows this link, declared in the same act, ordem person · role · link · since · squads) tela não no source shows this link: 0; declared in the same act: 0 em show.ex. O describe "a seção (§3.4)" do teste refere a seção nova, não a lista de membros. Itens 19–21 da régua não implementados
§3.7 — recusa data de início no futuro funcional não declare_team_membership/5 (commands.ex:69-115) não tem nao_esta_no_futuro/1; a checagem existe só para a saída (:161)
§3.7 — pessoa de outra organização → not found, nunca "no permission" funcional sem evidência not found tem 3 ocorrências em show.ex, nenhuma asserida nos testes de H2
recusa do domínio no idioma da tela (o produto fala inglês) funcional não commands.ex devolve {:error, "esta pessoa já tem vínculo vigente nesta equipe, com início desconhecido"}; o handler declarar_vinculo (show.ex:596) faz {:error, motivo} when is_binary(motivo) -> put_flash(socket, :error, motivo) — imprime a string do domínio crua. O próprio teste :265 asserta a palavra "papel" no HTML. É a mudança 4 que o README listou como exigida, e não aconteceu
a tela não levanta em vínculo vigente com started_at nulo (87 de 90 no banco) funcional sim vinculo_possivel_test.exs:75; commands.ex:40 cláusula %TeamMembership{started_at: nil} separada

Fase derivada: sro.not_accepted_deliverable — quatro critérios não conformes por comportamento ou ausência (§3.1 item 2 e medidas não declaradas; §3.4 coluna link; §3.7 data futura; recusa em português impressa crua), dois sem evidência (autor do vínculo não asserido; not found para outra organização), dois parciais (vereditos 4 e 5 sem teste de tela; AC1 pelo autor). E, antes de qualquer critério: o protótipo que é a régua declara a própria aprovação como pendente, com duas perguntas abertas que mudam o desenho — a tela foi implementada sobre uma régua que o registro diz não estar fechada, e nenhum item de backlog registra artifact e prompt. Fase da tarefa: sro.non_successfully_performed_scrum_development_task — sem tarefa pretendida registrada. O que fecha, e a ordem: (1) a pessoa mantenedora responde P1, P2 e P3, o Design marca Decided e republica no mesmo endereço — se P1 for A, eo.team_membership ganha origin e as três medidas ganham YAML antes de a régua §3.1/§3.4 poder ser cumprida; (2) o item de backlog cita artifact, PROMPT.md e README.md; (3) §3.4 e §3.7 implementados; (4) as recusas do domínio passam pelo catálogo (dgettext) antes do flash; (5) testes: declared_by_user_id, vereditos 4 e 5 na tela, not found de outra organização, data futura recusada. Só então a conferência do QA item a item. Destino: entra no sprint 030 como herança, nova tarefa pretendida ligada a 055/US2 — e a issue #703, fechada em 2026-09-02 com a FR-003 sem tela, não é reaberta; o registro de que a US foi fechada antes de ser inteira fica.


Resumo

Quantidade
Entregáveis avaliados 3
Aceitos 1 — H3
Não aceitos 2 — H1 (avaliação incompleta: 4 cláusulas sem teste, QA item a item ausente), H2 (4 não conformes, régua não aprovada)
Tarefas executadas com sucesso 1 (sem tarefa pretendida registrada)
Tarefas executadas sem sucesso 2 (idem)
Entregável PR Fase proposta Causa dominante
H1 — D06 reavaliado (conta desativada) #853 sro.not_accepted_deliverable os 5 pontos da recusa original estão fechados com evidência; restam 3 cláusulas dos FR-025/027 sem teste, a transação sem teste de falha injetada, e a conferência do QA não encontrada
H2 — FR-003 com tela (vincular pessoa) #863 sro.not_accepted_deliverable régua (§3.4, §3.7, §3.1 item 2) não cumprida; recusa do domínio em português na tela; protótipo com aprovação pendente no próprio README; medidas não declaradas
H3 — subequipe numa transação #857 sro.accepted_deliverable Repo.transaction + teste de falha injetada que passa; 8 caminhos infelizes sem exceção

O que os três têm em comum, e não é dos critérios: revisão nunca pedida e não registrada; nenhuma issue fechada; nenhum item em sprint backlog (rule01) — o registro retroativo do 030 existe para fechar o terceiro; os dois primeiros são resíduo que não se recupera em PR mergeado, e a decisão de exceção continua sendo do papel.

Critérios alterados durante o sprint

Critério User story Alterado em O que mudou Por quê
FR-025 a FR-029 (045) nenhuma US da 045 os carrega 2026-09-10, no #853 acrescentados à spec, formalizando os critérios de docs/backlog/conta-desativada.md (2026-09-09) e as decisões do protótipo a recusa do D06 pediu exatamente isto; a origem é anterior ao código, o texto normativo não
FR-003 (055) US2 2026-09-06 (emenda) vincular do zero fica para quem a origem não mostra; o observado nasce sem papel anterior ao #863; avaliado na versão emendada

Critérios sem evidência

Critério Entregável O que falta
sem vocabulário declarado, desativar recusa H1 teste com a base ausente → {:error, :vocabulario_nao_declarado}
nota omitida escreve a frase de ausência H1 asserção de "no note" na linha
temporary_source_not_recorded dita como tal H1 asserção na credencial anterior à coluna
disabled_at e episódio na mesma transação H1 teste que injeta falha em Repo.insert do episódio e prova disabled_at nulo
roster, medidas e histórico não mudam H1 medida computada da pessoa comparada antes/depois (roster, elo, escopos e senha já são)
conferência do QA item a item da §3 com captura H1, H2 o registro do QA
o vínculo guarda quem o declarou H2 asserção declared_by_user_id == ator.id
vereditos 4 e 5 na tela H2 teste de renderização
outra organização → not found H2 teste
não autentica por token H1 o token (spec 061) — não avaliável, e não conta como conforme

Não medido, e por quê

  • mix gates e a suíte inteira: não rodados aqui por instrução; a run do CI 34779226200 sobre 0ccf02b está success e é a evidência dos gates.
  • Captura da tela real (/accounts, /teams/:id?tab=structure): não feita — a avaliação usou renderização em teste e presença de textos; a captura ao lado da régua é o que o QA entrega.

Parte C — o que atravessa as duas partes

O #860, que não foi avaliado

O PR #860 (2026-09-12) entregou a aba Flow per person — US10–US12 da extensão spec-graficos-por-membro.md (FR-085 a FR-112). O tasks.md da 060 as declarava sem tarefa, "dependentes da US9 e de protótipo que ainda não existe"; o protótipo foi aprovado em 2026-09-08 e a tela entrou fora do plano. Os requisitos estão sendo transcritos do protótipo agora, no PR #913. Não classificável por critérios neste registro: as US existem na extensão, mas não estavam em backlog nenhum — pelo axioma sro.rule01, é escopo que entrou sem passar pelo planejamento. Registrado, não aceito nem recusado; a avaliação é própria, depois do #913.

O que acontece com as issues, depois da confirmação

Não há issues. A 060 não tem épico, user story nem tarefa no GitHub; #853, #857 e #863 não fecharam issue nenhuma. Proposto, e nada executado até a confirmação: criação retroativa das issues da 060 (6 US + 29 tarefas) e das três de herança, como a 052 no sprint 026 — cada uma dizendo que nasceu depois do trabalho, fechada no mesmo ato quando a fase for accepted, aberta com destino quando não for. A criação retroativa não conserta o que a lacuna custou: flow.wip.count subcontou o sprint enquanto ele corria.

Destino das user stories e dos entregáveis

Entregável Fase proposta Destino
060/US1 (D1) não aceita — teste ausente próximo sprint, primeira: abas_da_equipe_test, estrutura_membros_test, estrutura_permissao_test; FR-004 "composta de K"
060/US2 (D4) não aceita — AC2 não medido decisão do papel na confirmação
060/US3 (D2) não aceita — SC-013 não medido cronometrar na confirmação
060/US4 (D3) aceita concluída; localizar a asserção de AC5 ou registrar a lacuna
060/US5 (D5) não aceita — SC-005/FR-081 não medidos medir com duas equipes + seção Roles
060/US9 (D6) não aceita — defeito nova tarefa via Design: o cartão Squads at a glance conforme o protótipo; SC-009; FR-064
045 · D06 refeito (H1) não aceito — 4 cláusulas sem teste nova tarefa: os quatro testes, a conferência §3 com captura, e a US que a 045 precisa declarar
055 · FR-003 com tela (H2) não aceito — régua pendente, §3 furada ordem obrigatória (ver H2): decisões P1–P3 → republicação → medidas → §3.4/§3.7 → recusas pelo catálogo → testes → QA
055 · subequipe numa transação (H3) aceito concluído
#860 · aba Flow per person não avaliado registro próprio depois do #913

A revisão, e a decisão que este registro não toma

Dez PRs compõem o sprint (#816–#821, #853, #857, #860, #863). Nenhum tem revisão registrada; #853, #857, #860 e #863 nem pediram. A skill diz que revisão nunca pedida impede aceitação; a v0.7.0 e a v0.8.0 trataram a mesma lacuna como exceção de release decidida pelo papel. As duas leituras estão escritas; a escolha é da pessoa alocada ao papel, e vale para as duas partes deste registro.