task-validator
Skill5 starsChanged 20 days agoMITView on GitHub
Valida TASKs SDD (TASK-*.md do projeto): vínculo ao PLAN, FRs realizados, ACs cobertos, dependências sem ciclos, campos de closure. Ativar após /keelson:tasks ou quando pedirem conferência das tasks ("estão prontas?"). Reporta por severidade
1 other project uses a version of this.
Adopted by
Most recently taken up by
- DidierRLopes/openbb-workspace-benchtheir own version, first seen Jul 29, 2026
Other versions1 project uses a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 1
- DidierRLopes/openbb-workspace-bench★ 2same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository11 other files it gives its agents.
- AGENTS.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- field-intakeSkill
- harness-auditSkill
- idea-forgeSkill
- pr-reviewSkill
- skill-standardsSkill
- plan-validatorSkill
- screen-verifySkill
- spec-validatorSkill
- statusSkill
The file
Files
Skill: task-validator
Você é um Quality Engineer: valide a TASK contra os checks abaixo.
Protocolo comum (leia antes de validar): a moldura desta skill vive em ${CLAUDE_PLUGIN_ROOT}/skills/_shared/validator-protocol.md — calibração por exemplares, setup, severidades/auto-fix, gate de status/override, relatório, evento de aprendizado e limites. Abaixo, só os checks próprios de TASK. Exemplares (protocolo §1): TASKs Done de PLANs mergeados em {docsRoot}/*/tasks/; comando gerador (protocolo §6): commands/tasks.md.
Input e contexto
Caminho de uma ou mais TASK-*.md, ou de um TASK-MMM-INDEX.md (dispara validação batch de todas as tasks daquele PLAN). Contexto a ler (protocolo §2):
- a TASK, o PLAN (
Pertence a), a SPEC referenciada pelo PLAN (incluindo o mapa FR→FEAT quando a §5 declara FEATs) e as outras TASKs do mesmo PLAN; - sob demanda — só para o check de profundidade da Etapa 3 (decisão 4.428) e para o que o
suite-filter-check.shdeclara fora do alcance (4.429): o arquivo de teste já existente que um critério nomeia junto de--group/--testsuitee a config do runner com o mapa de suítes; arquivo que a própria TASK vai criar é n/a (ou o molde, 4.342).
Modo avulso (decisão 4.86) — TASK com **Brief**: no lugar de **Pertence a**: é
ancorada num brief avulso (briefs/BRIEF-MMM-*-avulso.md), fora do ciclo SPEC/PLAN.
Substituições, válidas para todas as etapas abaixo: o contexto é o brief (não há
PLAN/SPEC); não existem FR, AC, FEAT nem COMP — checks que os exigem são n/a
(Realiza (FRs), Funcionalidade, Componente, vínculo a AC); no lugar deles, os
critérios de pronto devem ancorar no critério de aceite do brief — ERROR se nenhum
critério o referencia. Âncora dupla, referência quebrada e MMM divergente chegam como
fato (task-ancora-dupla, ref-quebrada, pertence-vs-arquivo — Etapa 2). O resto da
régua (escopo, verificação executável, closure, convenções, tipo) vale idêntico.
Batch com FEATs: a coerência Funcionalidade × derivado é fato do grafo (feat-divergente); o que fica seu é o WARNING quando alguma FEAT da SPEC com FR coberto pelo PLAN não tem nenhuma TASK que a liste — leia-o da tabela "Cobertura por funcionalidade" de graph.sh {docsRoot}/<slug> --format=tables --plan MMM (derivada, 4.409; o TASK-MMM-INDEX não a escreve mais). (As divergências de waves e das tabelas de FR/AC do TASK-MMM-INDEX já chegam como fato — check index-desatualizado da Etapa 2; a seção de funcionalidade permanece sua.)
Etapa 1: fato mecânico primeiro — forma
A forma da TASK tem dono único e execução mecânica — catálogo, severidades e régua
de rebaixamento (Done → WARNING [legacy]) em
${CLAUDE_PLUGIN_ROOT}/docs/_meta/conventions/lint-contract.md. Execute (num subagent
executor sem a env var, derive a raiz do plugin do caminho deste SKILL.md — o prefixo
antes de /skills/):
bash "${CLAUDE_PLUGIN_ROOT}/scripts/artifact-lint.sh" <caminho-da-TASK> # TASK avulsa
bash "${CLAUDE_PLUGIN_ROOT}/scripts/artifact-lint.sh" <diretório-do-slug> # modo batch (via INDEX): + checks cross-arquivoChega como fato (task-* do lint-contract §3): campos e enums do cabeçalho (Slug,
Wave, Tamanho estimado, Status, Tipo — ausente → auto-fix feature), as 8
seções obrigatórias (+ Inclui/Não inclui), marcador -fix-/-refactor-/-chore- do
nome vs Tipo, Wave 2+ sem dependência, 2+ FEATs sem (primária) nem forma
transversal (…) e transversal com 1 FEAT, critérios de pronto vazios ou sem menção a
AC, critério com grep/rg de padrão textual sem âncora de símbolo/fronteira (4.161),
bugfix sem **AC violado**: (forma antiga dentro de Realiza → INFO, não
reprova), refactor sem "comportamento observável idêntico", Done com gate desmarcado
sem consolidação declarada (4.90). Invocado com o diretório do slug (batch),
acrescenta task-overlap-fr (FR realizado por 2+ TASKs do mesmo PLAN) e
task-wave-overlap-arquivo (mesmo arquivo no Inclui de 2+ TASKs da mesma wave —
best-effort declarado: só caminho parseável ou nome solto com extensão de código conta,
e ausência de achado não prova ausência de colisão; 4.326, 4.454) e
task-consumidor-paralelo-ao-criador (símbolo em crase nos Critérios/Roteiro de uma TASK
declarado no Inclui de outra do mesmo PLAN em wave igual ou anterior, sem Depende de;
4.491) e task-compartilhado-sem-dono (símbolo em crase no Inclui de 2+ TASKs do mesmo
PLAN sem dona única — nenhuma é alvo de Depende de de todas as outras; 4.492).
Cada achado entra como **[artifact-lint]** SEVERIDADE check — detalhe.
Permanecem seus (o script não computa):
- Âncora presente:
Pertence a(ciclo) ouBrief(avulso) — ERROR se nenhuma (exclusividade e existência chegam como fato — Etapa 2) Realiza (FRs)listado (ciclo; n/a no avulso) ·ComponentepresenteFuncionalidadeobrigatória somente quando a SPEC do PLAN declara FEATs e a TASK realiza FRs (ERROR se ausente nesse caso). Presente com SPEC sem FEATs → WARNING + auto-fix de remoção da linha.choresem FR → pode omitir.
Etapa 2: fato mecânico do grafo (vinculação, dependências, cobertura)
Os checks estruturais desta etapa têm dono único e execução mecânica — catálogo de
checks, severidades e carência de legado em
${CLAUDE_PLUGIN_ROOT}/docs/_meta/conventions/graph-contract.md. Execute (diretório do
slug já resolvido via docsRoot):
bash "${CLAUDE_PLUGIN_ROOT}/scripts/graph.sh" {docsRoot}/<slug> --check --stage=tasks --plan MMMChega como fato: referência quebrada (PLAN, FR, COMP, AC, FEAT ou TASK inexistente), FR
de Realiza fora da cobertura do PLAN, conjunto/primária de Funcionalidade divergente
do derivado, ciclo de dependência, wave incoerente, ID duplicado, Pertence a vs
arquivo, FR/AC coberto sem TASK, assimetria Depende de/Bloqueia, PLAN Done com TASK
aberta (plan-status-vs-tasks — 4.153) e closure preenchida com Status ≠ Done
(status-vs-closure).
- Cada achado entra no relatório como fato —
**[graph.sh]** SEVERIDADE check — detalhe— somado à lista da severidade correspondente. A calibração final é sua (protocolo §1/§3): o fato substitui a derivação, nunca o julgamento. - Degradação por resultado: execução sem saída válida no contrato (script ausente, exit 2, crash, saída malformada) → aplique os mesmos checks por leitura, seguindo o catálogo do graph-contract.md, e declare a degradação com a causa nomeada.
- Cobertura mista: artefato com achado
nao-parseavel→ não cite ausência de defeito como fato para os checks que dependem daquela aresta — para esse artefato valem seus próprios olhos, declarado no relatório.
Etapa 3: checks de critérios de pronto que permanecem seus
ERROR se:
- AC vinculado ao FR realizado não aparece em nenhum critério
- Critério de teste (gate 1) sem verificação executável anexada — comando + saída/efeito esperado (só TASK em
Todo/In Progress;Donelegada não reprova por isso) - Fato
task-criterio-grep-nao-ancorado(4.161) e a condição do critério é estrutural — assinatura, campo, projeção, predicado, chave de payload: escale para ERROR quando o padrão de texto não resiste a prosa/comentário ou nomeia símbolo de outra camada (ex.: campo do VO em camelCase onde o payload usa snake_case — cumprir à risca ensina o bug de volta); condição legitimamente textual (docstring exigida, mensagem literal) → o WARNING fica como está - Fato
task-criterio-grep-alvo-amplo(4.456) e o critério é de ausência (esperado vazio/0): escale para ERROR — sobre diretório inteiro o comando casa cache/vendor/autoload e nunca converge; o conserto égit grep -w <símbolo> -- <dir-fonte>ou o caminho da subárvore. Grep recursivo de presença (esperado > 0) → o WARNING fica - Fato
task-criterio-diff-base-vazio(4.459) e a TASK está em wave ≥ 2 ou declaraDepende de: escale para ERROR — as waves anteriores da branch já tocaram a árvore e o diff contra a default nunca fica vazio; o conserto ancora o range na base da TASK (git diff <SHA do commit-pai>..HEAD -- <caminho>). Wave 1 sem dependência → o WARNING fica (a fixação da 4.256 confere no commit-pai) - Fato
task-criterio-cifrao-aspas-duplas(4.463) e o critério é de ausência (esperado vazio/0): escale para ERROR — o shell expande o$nomeantes do grep, o padrão buscado não é o escrito e o vazio aprova qualquer diff; o conserto é aspas simples ou\$. Critério de presença (esperado > 0) → o WARNING fica: o developer vê o zero e corrige - Fato
task-contrato-sem-ancora(4.467) e a rota/Action/DTO que o critério consome já existe no repo (Grep do símbolo/rota): escale para ERROR — status, envelope, domínio de valores, nome de campo e label fixados do PLAN divergem do que o servidor devolve e o developer implementa a tela contra a crença errada; o conserto citaarquivo:linhada fonte. Rota que nasce nesta TASK → o WARNING fica (o molde do item (a)/4.342 é a fonte) - Critério com proibição (nunca/proibido/não deve + chamada, símbolo ou padrão) que o PLAN-pai prescreve criar/usar — contradição critério×PLAN (decisão 4.257): o confronto é seu — você tem o PLAN em contexto, e fato de lint é imecanizável aqui sem parser semântico de prescrição (anti-padrão 4.227); proibição sobre contexto que o PLAN não alcança → não é contradição
- Fato
task-comando-contradiz-criterio(4.215) e a proibição é regra de lição/convenção do projeto que o comando viola de verdade (o developer executa o comando, nunca a prosa — o comando vence em silêncio): escale para ERROR; menção legítima da tag (ex.: proibição sobre outro contexto que o comando não alcança) → o WARNING fica como está - Fato
task-prova-seguranca-com-grupo(4.233) e a tag é grupo que a config default da suíte do projeto exclui (lição/convenção do projeto o diz, ou a ficha/perfil o declara): escale para ERROR — prova de segurança fixada fora da rodada default nunca roda onde o time olha; tag de grupo que a suíte default seleciona → o WARNING fica como está - Fato
task-wave-overlap-arquivo(4.326) e o caminho é de fato o mesmo arquivo de código/config que ambas as TASKs editam: escale para ERROR — mesma wave é candidata a paralelo, e o conserto é da decomposição (re-sequenciar por wave/dependência, princípio 2 do/keelson:tasks), nunca confiar que o dispatch do implement vai pegar; token de prosa que o parser leu como caminho, ou arquivo que só uma das TASKs de fato edita → o WARNING fica como está; achado "casada pelo nome" (4.454) exige conferir o diretório antes de escalar — mesmo basename em diretórios distintos não é o mesmo arquivo - Fato
task-consumidor-paralelo-ao-criador(4.491) e o símbolo não existe no repo (Grep) — nasce na TASK que o declara: escale para ERROR — o critério da consumidora só é executável com o código da irmã no disco, e mesma wave é candidata a paralelo; o conserto é a arestaDepende de(wave posterior) ou o item no próprio Inclui quando é contrato congelado (4.106), nunca nota em prosa. Símbolo que já existe no repo (a irmã só o usa) → o WARNING fica como está - Fato
task-compartilhado-sem-dono(4.492) e o símbolo não existe no repo (Grep) — nasce em alguma delas: escale para ERROR — duas TASKs vão criá-lo (duplicata ou colisão, pega só no gate 7); o conserto é o protocolo da aresta (4.106): uma cria e o carrega no Inclui, as demais o citam emDepende de(wave posterior). Símbolo que já existe no repo (todas só o usam) → o WARNING fica como está - Fato
task-mutacao-sem-contagem(4.232) e a TASK toca camada de persistência com escopo (tenant/dono/agregado): escale para ERROR — sem o denominador "todo método que toca a tabela", método de escrita sem predicado sai da contagem por construção (IDOR real chegou ao gate 8 assim); menção a mutação fora de contexto de persistência → o WARNING fica como está
WARNING se:
- Critério não-verificável ("usuário fica feliz")
- Falta critério explícito de cobertura de teste
- Filtro sem filiação real (decisões 4.428/4.429 — fato mecânico): execute
bash "${CLAUDE_PLUGIN_ROOT}/scripts/suite-filter-check.sh" <raiz-do-projeto> <TASK | TASK-MMM-INDEX>(contrato no cabeçalho do script; cobre PHPUnit — outro runner é silêncio, não fato) e cite cada linha como**[suite-filter-check]** WARNING check — detalhe:--group <tag>sobre arquivo que existe e não carrega a anotação (roda zero ou outro arquivo com "N > 0" verde), arquivo em grupo excluído por padrão na config citado por comando sem--groupdesse grupo,--testsuitefora da suíte ou inexistente. Alvos de filiação heterogênea sob um comando único chegam como um achado por arquivo; arquivo que a TASK vai criar é n/a (o script o conta no resumo). Fica por leitura só o que o script declara fora do alcance — herança além de 1 nível, grupo vindo de trait, config de subdiretório — e o runner que ele não cobre. Para--testsuite, o fato do linttask-criterio-alvo-nao-isoladocontinua: complemente, não duplique. - Fato
task-criterio-esperado-placeholder(4.447): não escala — cite a contagem no veredito como estado da fixação (o número vem do baseline do developer, etapa 2); item com placeholder e sem comando cai na régua acima (critério sem verificação executável, ERROR) - AC visível sem carregador (decisão 4.428 — eixo profundidade; só com
gates.screenVerifyouquality.e2eativos na ficha, senão n/a declarado; modo avulso n/a): AC cujo Então na SPEC promete efeito que o usuário vê (painel, tela, exibe, visível, legível — leia o AC, não case palavra: "lista" de endpoint não é tela) citado só em critérios de gate 1 que param num objeto de domínio/mock, sem que nenhuma TASK do PLAN o cite num passo do Roteiro do gate 9 nem num critério de spec E2E, e sem a qualificação inline de cobertura parcial nomeando o carregador. O conserto é do gerador: o critério alcança o leitor real e a faceta de renderização ganha carregador. Carregador fora do default (4.453): comquality.e2ena ficha, AC visível cujo carregador nomeado é o Roteiro do gate 9 sem motivo declarado inline (fluxo que o runner não alcança) → WARNING — o default é o spec E2E por AC, provado no gate 1 da própria wave; o Roteiro só prova no fecho da FEAT. - AC de regra de servidor provado só com mock (decisão 4.468 — simétrico de escrita do eixo profundidade; só com
quality.e2eougates.screenVerifyativos, senão n/a declarado; modo avulso n/a): AC cujo Então depende de o servidor aceitar ou recusar (validação, status de recusa, domínio de valores, permissão) cujo único carregador nomeado — critério de spec E2E ou passo do Roteiro — intercepta a chamada que carrega a regra (route.fulfill,page.route, mock do cliente HTTP) → WARNING; a TASK nomeia ao menos um caso contra o backend real com estado semeado, ou declara inline por que o mock basta (estado transitório, falha injetada). Por leitura: o spec ainda não existe na fixação.
Etapa 4: checks de escopo
ERROR se:
- Escopo > Inclui vazio
- Escopo > Não inclui vazio
- Cobertura reversa: item do Inclui que nenhum critério de pronto referencia — critério genérico ("testes de tudo acima", "tudo coberto") não conta como referência; item sem AC exige critério ancorado no contrato do próprio item (só TASK em
Todo/In Progress;Donelegada não reprova por isso)
WARNING se:
- Inclui menciona conceitos não mapeados no PLAN
- Não inclui menciona trivial/óbvio
Etapa 5: checks do histórico de execução
ERROR se:
- Status =
Donemas campos do histórico vazios (closure não foi feita) — exceto acervo legado (TASK de PLAN mergeado antes da disciplina de closure): registre INFO - Status ≠
Donemas histórico preenchido (o fatostatus-vs-closureda Etapa 2 aponta; a inconsistência inversa é sua)
Etapa 6: checks específicos por tipo que permanecem seus
- bugfix — WARNING se: descrição não cita comportamento atual vs esperado.
- refactor — WARNING se: PLAN referenciado é Done e não há PLAN novo cobrindo o refactor.
- chore — INFO: chore não precisa FR vinculado.
Fechamento
Aplicar auto-fixes, gate de status e relatório conforme o protocolo (§3–§6). No relatório desta skill, inclua também a linha **Tipo**: <tipo>.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

