adi_dev_workflow 1.3.0 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/frameworks/commands/ministack/generate-tasks.md +212 -212
- package/frameworks/commands/sdd/generate-task-plan.md +4 -4
- package/frameworks/commands/sdd/generate-tech-direction.md +2 -2
- package/frameworks/commands/sdd/generate-tech-spec.md +4 -4
- package/frameworks/commands/sdd/generate-tests.md +171 -39
- package/frameworks/config/ai-framework-config.yaml +2 -2
- package/frameworks/skills/ministack-tasks-expert/SKILL.md +115 -104
- package/frameworks/skills/ministack-tech-direction-expert/SKILL.md +21 -6
- package/frameworks/skills/prompt-engineer-expert/SKILL.md +10 -7
- package/frameworks/skills/sdd-tech-direction-expert/SKILL.md +21 -6
- package/frameworks/skills/sdd-tech-spec-expert/SKILL.md +23 -7
- package/package.json +1 -1
- package/src/cli.js +27 -2
- package/src/installer.js +185 -106
- package/frameworks/agents/qa-validation-expert.md +0 -458
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/benchmark.json +0 -99
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/benchmark.md +0 -64
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/eval_metadata.json +0 -12
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/with_skill/grading.json +0 -32
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/with_skill/outputs/response.md +0 -134
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/with_skill/outputs/transcript.md +0 -68
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/with_skill/timing.json +0 -5
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/without_skill/grading.json +0 -32
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/without_skill/outputs/response.md +0 -525
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/without_skill/outputs/transcript.md +0 -30
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/without_skill/timing.json +0 -5
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/eval_metadata.json +0 -12
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/with_skill/grading.json +0 -32
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/with_skill/outputs/response.md +0 -1126
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/with_skill/outputs/transcript.md +0 -131
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/with_skill/timing.json +0 -5
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/without_skill/grading.json +0 -32
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/without_skill/outputs/response.md +0 -452
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/without_skill/outputs/transcript.md +0 -78
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/without_skill/timing.json +0 -5
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/eval_metadata.json +0 -12
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/with_skill/grading.json +0 -32
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/with_skill/outputs/response.md +0 -101
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/with_skill/outputs/transcript.md +0 -133
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/with_skill/timing.json +0 -5
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/without_skill/grading.json +0 -32
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/without_skill/outputs/response.md +0 -248
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/without_skill/outputs/transcript.md +0 -49
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/without_skill/timing.json +0 -5
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/review.html +0 -1325
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/benchmark.json +0 -94
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/benchmark.md +0 -67
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/eval_metadata.json +0 -12
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/with_skill/grading.json +0 -32
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/with_skill/outputs/response.md +0 -117
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/with_skill/outputs/transcript.md +0 -91
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/with_skill/timing.json +0 -1
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/without_skill/grading.json +0 -32
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/without_skill/outputs/response.md +0 -694
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/without_skill/outputs/transcript.md +0 -45
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/without_skill/timing.json +0 -1
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/eval_metadata.json +0 -12
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/with_skill/grading.json +0 -32
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/with_skill/outputs/response.md +0 -1087
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/with_skill/outputs/transcript.md +0 -124
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/with_skill/timing.json +0 -1
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/without_skill/grading.json +0 -32
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/without_skill/outputs/response.md +0 -458
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/without_skill/outputs/transcript.md +0 -84
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/without_skill/timing.json +0 -1
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/eval_metadata.json +0 -12
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/with_skill/grading.json +0 -32
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/with_skill/outputs/response.md +0 -70
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/with_skill/outputs/transcript.md +0 -148
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/with_skill/timing.json +0 -1
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/without_skill/grading.json +0 -32
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/without_skill/outputs/response.md +0 -249
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/without_skill/outputs/transcript.md +0 -80
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/without_skill/timing.json +0 -1
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/review.html +0 -1325
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
# Transcript — Tool Calls for Task Plan Generation
|
|
2
|
-
|
|
3
|
-
## Objetivo
|
|
4
|
-
Gerar um TASK PLAN para a feature "Adicionar Telefone ao Usuario v1" baseado no SPEC_TECH aprovado.
|
|
5
|
-
|
|
6
|
-
## Ferramentas Utilizadas
|
|
7
|
-
|
|
8
|
-
### 1. ToolSearch — Carregar ferramentas
|
|
9
|
-
- **Query:** `select:Read,Glob,Bash,Write`
|
|
10
|
-
- **Resultado:** 4 ferramentas carregadas com sucesso
|
|
11
|
-
|
|
12
|
-
### 2. Glob (6 chamadas em paralelo) — Descobrir arquivos relevantes
|
|
13
|
-
- `internal/db/migrations/*.sql` → Encontrou: `001_create_usuarios.sql`
|
|
14
|
-
- `internal/db/queries/*.sql` → Nenhum resultado (caminho incorreto)
|
|
15
|
-
- `internal/repository/user*.go` → Encontrou: `user_repository.go`
|
|
16
|
-
- `internal/service/user*.go` → Encontrou: `user_service.go`, `user_service_test.go`
|
|
17
|
-
- `internal/handler/grpc/user*.go` → Encontrou: `user_handler.go`, `user_handler_test.go`
|
|
18
|
-
- `api/proto/v1/user*.proto` → Encontrou: `user.proto`
|
|
19
|
-
|
|
20
|
-
### 3. Read (7 chamadas em paralelo) — Ler conteudo dos arquivos
|
|
21
|
-
- `internal/db/migrations/001_create_usuarios.sql` — Schema atual da tabela usuarios
|
|
22
|
-
- `api/proto/v1/user.proto` — Definicao proto atual (CreateUser, GetUser)
|
|
23
|
-
- `internal/repository/user_repository.go` — Repository com modelo User e interface
|
|
24
|
-
- `internal/service/user_service.go` — Service com CreateUserInput e validacoes
|
|
25
|
-
- `internal/handler/grpc/user_handler.go` — Handler gRPC com mapeamento de erros
|
|
26
|
-
- `internal/service/user_service_test.go` — Testes do service (mock + table-driven)
|
|
27
|
-
- `internal/handler/grpc/user_handler_test.go` — Testes do handler
|
|
28
|
-
|
|
29
|
-
### 4. Glob (3 chamadas em paralelo) — Buscar queries SQLC e config
|
|
30
|
-
- `**/sqlc.yaml` → Encontrou: `internal/db/sqlc/sqlc.yaml`
|
|
31
|
-
- `**/queries/*.sql` → Encontrou: `internal/db/sqlc/queries/user.sql`
|
|
32
|
-
- `**/sqlc/**` → Confirmou estrutura do diretorio
|
|
33
|
-
|
|
34
|
-
### 5. Read (2 chamadas em paralelo) — Ler queries SQLC e configuracao
|
|
35
|
-
- `internal/db/sqlc/queries/user.sql` — Queries CreateUser e GetUserByID
|
|
36
|
-
- `internal/db/sqlc/sqlc.yaml` — Configuracao SQLC (engine sqlite)
|
|
37
|
-
|
|
38
|
-
### 6. Glob (3 chamadas em paralelo) — Verificar codigo gerado e FX
|
|
39
|
-
- `gen/**/*.go` → Nenhum resultado (codigo gerado nao commitado)
|
|
40
|
-
- `internal/handler/grpc/fx.go` → Encontrado
|
|
41
|
-
- `internal/infra/grpc/server.go` → Encontrado
|
|
42
|
-
|
|
43
|
-
### 7. Bash — Listar diretorio SQLC
|
|
44
|
-
- Comando: `ls -la internal/db/sqlc/`
|
|
45
|
-
- Resultado: Apenas `queries/` e `sqlc.yaml` (sem Go gerado)
|
|
46
|
-
|
|
47
|
-
### 8. Read (2 chamadas em paralelo) — Ler FX e server
|
|
48
|
-
- `internal/handler/grpc/fx.go` — Modulo FX do handler (registra UserServiceServer)
|
|
49
|
-
- `internal/infra/grpc/server.go` — Servidor gRPC (registra UserService, auth interceptor)
|
|
50
|
-
|
|
51
|
-
### 9. Bash — Verificar diretorio de output
|
|
52
|
-
- Verificou existencia do diretorio workspace
|
|
53
|
-
|
|
54
|
-
### 10. Bash — Criar diretorio de output
|
|
55
|
-
- Criou `without_skill/outputs/`
|
|
56
|
-
|
|
57
|
-
### 11. Write — Salvar response.md
|
|
58
|
-
- Task Plan completo com 12 tasks
|
|
59
|
-
|
|
60
|
-
### 12. Write — Salvar transcript.md
|
|
61
|
-
- Este arquivo
|
|
62
|
-
|
|
63
|
-
## Resumo de Descobertas
|
|
64
|
-
|
|
65
|
-
| Aspecto | Situacao Atual |
|
|
66
|
-
|---------|----------------|
|
|
67
|
-
| **Migracao** | 1 arquivo (001), sem down migration |
|
|
68
|
-
| **SQLC queries** | 2 queries (CreateUser, GetUserByID) |
|
|
69
|
-
| **SQLC gerado** | Nao presente no repo (nao commitado) |
|
|
70
|
-
| **Proto** | 2 RPCs (CreateUser, GetUser), sem UpdateUser |
|
|
71
|
-
| **Proto gerado** | Nao presente no repo (nao commitado) |
|
|
72
|
-
| **Repository** | Interface com Create e GetByID, sem Update |
|
|
73
|
-
| **Service** | Interface com CreateUser e GetUser, sem UpdateUser |
|
|
74
|
-
| **Handler** | Implementa CreateUser e GetUser |
|
|
75
|
-
| **Testes service** | 11 testes (validacao, hash, UUID, erros) |
|
|
76
|
-
| **Testes handler** | 12 testes (sucesso, erros, mapeamento) |
|
|
77
|
-
|
|
78
|
-
Conclusao: A feature requer adicoes em todas as camadas + criacao do endpoint UpdateUser que nao existe.
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"eval_id": 3,
|
|
3
|
-
"eval_name": "spec-tech-sem-user-stories-explicitas",
|
|
4
|
-
"prompt": "Gere o TASK PLAN para esta feature. Segue o SPEC_TECH aprovado:\n\n---\n# SPEC_TECH — Cache de Cardapio v1\n\n## 1. Identificacao\n| Campo | Valor |\n|-------|-------|\n| **Feature/Projeto** | Cache de Cardapio em Memoria |\n| **Versao** | v1 |\n| **Data** | 2026-03-07 |\n\n## 2. Resumo Tecnico\nImplementar cache in-memory (sync.Map) para o cardapio de produtos, evitando queries repetidas ao SQLite. TTL configuravel via config.yaml.\n\n## 3. Definicoes Tecnicas\n\n### 3.1 Novo Pacote\n- `internal/infra/cache/` com interface `Cache[K, V]` e implementacao `InMemoryCache`\n- TTL configuravel via `cache.ttl_seconds` no config.yaml\n- Invalidacao manual via metodo `Invalidate(key)`\n\n### 3.2 Service\n- ProductService passa a consultar cache antes do repository\n- Cache miss: busca no repository e popula cache\n- Operacoes de escrita (Create, Update, Delete) invalidam a entrada correspondente\n\n### 3.3 Config\n- Novo campo `cache.ttl_seconds` (padrao: 300)\n\n### 3.4 DI\n- Registrar modulo cache no FX\n---",
|
|
5
|
-
"assertions": [
|
|
6
|
-
{"id": "c1", "text": "Detecta a ausencia de User Stories (US-XX) e PRD referenciado no SPEC_TECH", "type": "llm_judge"},
|
|
7
|
-
{"id": "c2", "text": "PERGUNTA ao usuario sobre User Stories / PRD em vez de inventar ou ignorar", "type": "llm_judge"},
|
|
8
|
-
{"id": "c3", "text": "NAO inventa User Stories ficticias (guardrail: nunca invente informacoes)", "type": "llm_judge"},
|
|
9
|
-
{"id": "c4", "text": "Extrai corretamente o nome da feature como 'cache-de-cardapio' ou similar em kebab-case", "type": "llm_judge"},
|
|
10
|
-
{"id": "c5", "text": "Segue o processo interativo (uma pergunta por vez, confirma nome antes de prosseguir)", "type": "llm_judge"}
|
|
11
|
-
]
|
|
12
|
-
}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"eval_id": 3,
|
|
3
|
-
"eval_name": "spec-tech-sem-user-stories-explicitas",
|
|
4
|
-
"configuration": "with_skill",
|
|
5
|
-
"expectations": [
|
|
6
|
-
{
|
|
7
|
-
"text": "Detecta a ausencia de User Stories (US-XX) e PRD referenciado no SPEC_TECH",
|
|
8
|
-
"passed": true,
|
|
9
|
-
"evidence": "Secao 3 explicita: 'O SPEC_TECH fornecido nao contem User Stories (US-XX) e nao referencia nenhum PRD.' Tambem identificou a dependencia critica do modulo de Produto inexistente."
|
|
10
|
-
},
|
|
11
|
-
{
|
|
12
|
-
"text": "PERGUNTA ao usuario sobre User Stories / PRD em vez de inventar ou ignorar",
|
|
13
|
-
"passed": true,
|
|
14
|
-
"evidence": "Formulou pergunta clara com 2 opcoes: (1) usuario fornece PRD/US ou (2) seguir sem, com rastreabilidade N/A. Aguarda resposta antes de avancar."
|
|
15
|
-
},
|
|
16
|
-
{
|
|
17
|
-
"text": "NAO inventa User Stories ficticias (guardrail: nunca invente informacoes)",
|
|
18
|
-
"passed": true,
|
|
19
|
-
"evidence": "Nenhuma User Story ficticia foi inventada. A resposta explicitamente identifica a ausencia e pergunta ao usuario."
|
|
20
|
-
},
|
|
21
|
-
{
|
|
22
|
-
"text": "Extrai corretamente o nome da feature como 'cache-de-cardapio' ou similar em kebab-case",
|
|
23
|
-
"passed": true,
|
|
24
|
-
"evidence": "Extraiu 'Cache de Cardapio em Memoria' e normalizou para 'cache-de-cardapio' em kebab-case."
|
|
25
|
-
},
|
|
26
|
-
{
|
|
27
|
-
"text": "Segue o processo interativo (uma pergunta por vez, confirma nome antes de prosseguir)",
|
|
28
|
-
"passed": true,
|
|
29
|
-
"evidence": "Seguiu sequencia: (1) extraiu nome, (2) perguntou sobre US/PRD ausentes, (3) perguntou sobre dependencia do modulo Produto. Indicou que confirmacao do nome e inicio das fases aguardam respostas anteriores."
|
|
30
|
-
}
|
|
31
|
-
]
|
|
32
|
-
}
|
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
# Resposta do Task Plan Expert — Interacao Inicial
|
|
2
|
-
|
|
3
|
-
## 1. Extração do Nome da Feature
|
|
4
|
-
|
|
5
|
-
Identifiquei o nome da feature na secao "1. Identificacao" do SPEC_TECH:
|
|
6
|
-
|
|
7
|
-
- **Feature/Projeto**: Cache de Cardapio em Memoria
|
|
8
|
-
- **Nome normalizado (kebab-case)**: `cache-de-cardapio`
|
|
9
|
-
- **Versao**: v1
|
|
10
|
-
- **Diretorio de saida**: `docs/cache-de-cardapio/v1/`
|
|
11
|
-
|
|
12
|
-
---
|
|
13
|
-
|
|
14
|
-
## 2. Analise Obrigatoria do Projeto (Codebase)
|
|
15
|
-
|
|
16
|
-
Antes de planejar qualquer task, explorei o codebase e identifiquei o seguinte:
|
|
17
|
-
|
|
18
|
-
### O que JA existe no projeto:
|
|
19
|
-
| Elemento | Status | Localizacao |
|
|
20
|
-
|----------|--------|-------------|
|
|
21
|
-
| Estrutura Clean Architecture (handler/service/repository) | Existe | `internal/` |
|
|
22
|
-
| Injecao de dependencia via Uber FX | Existe | `internal/infra/di/fx.go` |
|
|
23
|
-
| Config via Viper + `config.yaml` | Existe | `internal/infra/config/config.go`, `configs/config.yaml` |
|
|
24
|
-
| User module completo (handler, service, repo, tests) | Existe | `internal/handler/grpc/`, `internal/service/`, `internal/repository/` |
|
|
25
|
-
| SQLC para queries tipadas | Existe | `internal/db/sqlc/` |
|
|
26
|
-
| Migracao de usuarios | Existe | `internal/db/migrations/001_create_usuarios.sql` |
|
|
27
|
-
| Testes com testify/mock (table-driven) | Existe | `internal/service/user_service_test.go` |
|
|
28
|
-
| gRPC server com interceptors | Existe | `internal/infra/grpc/server.go` |
|
|
29
|
-
|
|
30
|
-
### O que NAO existe (precisa ser criado):
|
|
31
|
-
| Elemento | Status |
|
|
32
|
-
|----------|--------|
|
|
33
|
-
| Modulo de Produto (Product) — service, repository, handler, proto, migration, queries | **NAO existe** |
|
|
34
|
-
| Pacote de cache (`internal/infra/cache/`) | **NAO existe** |
|
|
35
|
-
| Campo `cache.ttl_seconds` no config | **NAO existe** |
|
|
36
|
-
| Tabela `produtos` no banco | **NAO existe** |
|
|
37
|
-
|
|
38
|
-
### Observacao Critica
|
|
39
|
-
|
|
40
|
-
O SPEC_TECH fala em "cache de cardapio de produtos" e menciona que o `ProductService` passara a consultar o cache antes do repository. Porem, **nao existe nenhum modulo de Produto no projeto**. Nao ha proto, migration, queries SQLC, repository, service ou handler de produtos.
|
|
41
|
-
|
|
42
|
-
Isso significa que o TASK PLAN precisara incluir tasks para criar o modulo de Produto completo OU o SPEC_TECH assume que esse modulo ja existe/sera criado em outra feature. Essa duvida sera direcionada ao usuario (veja secao 3).
|
|
43
|
-
|
|
44
|
-
---
|
|
45
|
-
|
|
46
|
-
## 3. Ponto de Atencao — User Stories e PRD Ausentes
|
|
47
|
-
|
|
48
|
-
O SPEC_TECH fornecido **nao contem User Stories (US-XX)** e **nao referencia nenhum PRD**.
|
|
49
|
-
|
|
50
|
-
No framework SDD, o TASK PLAN inclui uma **tabela de rastreabilidade obrigatoria** que mapeia User Stories do PRD para definicoes tecnicas do SPEC_TECH e para tasks correspondentes (Guardrail #8: "Rastreabilidade obrigatoria — toda User Story do PRD deve ter pelo menos uma task correspondente").
|
|
51
|
-
|
|
52
|
-
**Pergunta que faria ao usuario:**
|
|
53
|
-
|
|
54
|
-
> O SPEC_TECH fornecido nao contem User Stories (US-XX) e nao referencia um PRD. No framework SDD, a rastreabilidade User Stories -> Tasks e obrigatoria no TASK PLAN.
|
|
55
|
-
>
|
|
56
|
-
> Temos duas opcoes:
|
|
57
|
-
>
|
|
58
|
-
> 1. **Voce fornece o PRD ou as User Stories** relacionadas a esta feature, e eu incluo a rastreabilidade completa no TASK PLAN.
|
|
59
|
-
> 2. **Seguimos sem PRD/User Stories**, e a secao de rastreabilidade do TASK PLAN sera preenchida com "N/A — SPEC_TECH fornecido sem PRD/User Stories associadas". Neste caso, a rastreabilidade sera feita apenas entre definicoes tecnicas do SPEC e tasks.
|
|
60
|
-
>
|
|
61
|
-
> Qual opcao prefere?
|
|
62
|
-
|
|
63
|
-
---
|
|
64
|
-
|
|
65
|
-
## 4. Ponto de Atencao — Dependencia do Modulo de Produto
|
|
66
|
-
|
|
67
|
-
Alem da questao de User Stories, identifiquei uma dependencia critica:
|
|
68
|
-
|
|
69
|
-
**Pergunta que faria ao usuario (apos resposta da pergunta anterior):**
|
|
70
|
-
|
|
71
|
-
> O SPEC_TECH menciona que o `ProductService` passara a consultar o cache antes do repository, e que operacoes de escrita (Create, Update, Delete) invalidarao entradas do cache. Porem, **nao existe nenhum modulo de Produto no codebase atual** — nao ha proto, migration, queries, repository, service ou handler de produtos.
|
|
72
|
-
>
|
|
73
|
-
> Duas opcoes:
|
|
74
|
-
>
|
|
75
|
-
> 1. **O escopo deste TASK PLAN inclui a criacao do modulo de Produto completo** (migration, queries SQLC, repository, service, handler gRPC, proto) alem do cache. Isso aumenta significativamente o numero de tasks.
|
|
76
|
-
> 2. **O modulo de Produto sera criado em outra feature/SPEC_TECH**, e este TASK PLAN assume que ele ja existira quando as tasks forem executadas. Neste caso, incluo apenas as tasks de cache + integracao com o ProductService.
|
|
77
|
-
>
|
|
78
|
-
> Qual abordagem seguir?
|
|
79
|
-
|
|
80
|
-
---
|
|
81
|
-
|
|
82
|
-
## 5. Confirmacao do Nome e Inicio
|
|
83
|
-
|
|
84
|
-
Apos as respostas acima, a proxima interacao seria:
|
|
85
|
-
|
|
86
|
-
> Obrigado! Vamos iniciar o TASK PLAN para **Cache de Cardapio em Memoria (v1)**. Podemos iniciar a definicao macro das fases?
|
|
87
|
-
|
|
88
|
-
---
|
|
89
|
-
|
|
90
|
-
## Resumo da Interacao Inicial
|
|
91
|
-
|
|
92
|
-
| Etapa | Status |
|
|
93
|
-
|-------|--------|
|
|
94
|
-
| Leitura do SPEC_TECH | Concluido |
|
|
95
|
-
| Extracao do nome da feature | Concluido: `cache-de-cardapio` |
|
|
96
|
-
| Analise do codebase | Concluido |
|
|
97
|
-
| Identificacao de User Stories/PRD ausentes | Concluido — pergunta formulada |
|
|
98
|
-
| Identificacao de dependencia critica (modulo Produto) | Concluido — pergunta formulada |
|
|
99
|
-
| Confirmacao do nome e inicio das fases | Aguardando respostas anteriores |
|
|
100
|
-
|
|
101
|
-
**Proximo passo**: Aguardar respostas do usuario para as duas perguntas acima antes de avancar para a definicao macro das fases.
|
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
# Transcript — Tools Called
|
|
2
|
-
|
|
3
|
-
## Eval: eval-3-sem-user-stories (with_skill)
|
|
4
|
-
## Data: 2026-03-07
|
|
5
|
-
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
### 1. Read — Skill file e templates (paralelo)
|
|
9
|
-
|
|
10
|
-
**Ferramentas chamadas em paralelo:**
|
|
11
|
-
|
|
12
|
-
1. `Read` — `.claude/skills/sdd-task-plan-expert/SKILL.md`
|
|
13
|
-
- **Motivo**: Ler as instrucoes completas da skill para seguir o processo definido.
|
|
14
|
-
- **Resultado**: Skill carregada com sucesso. Contem processo interativo, guardrails, templates, regras de rastreabilidade e estrutura de arquivos.
|
|
15
|
-
|
|
16
|
-
2. `Read` — `.claude/skills/sdd-task-plan-expert/templates/task_plan_template.md`
|
|
17
|
-
- **Motivo**: Ler o template do TASK PLAN para saber a estrutura esperada.
|
|
18
|
-
- **Resultado**: Template contem secoes: Identificacao, Objetivo, Macro-Fases, Lista de Tasks, Rastreabilidade US->Tasks, Dependencias, Criterios de Conclusao, Riscos, Checklist.
|
|
19
|
-
|
|
20
|
-
3. `Read` — `.claude/skills/sdd-task-plan-expert/templates/task_template.md`
|
|
21
|
-
- **Motivo**: Ler o template da task individual para saber a estrutura detalhada.
|
|
22
|
-
- **Resultado**: Template contem secoes: Identificacao, Objetivo, Descricao Detalhada, Aceite Tecnico, Arquivos Impactados, Testes, Notas, Checklist.
|
|
23
|
-
|
|
24
|
-
---
|
|
25
|
-
|
|
26
|
-
### 2. Glob — Explorar estrutura do codebase (paralelo)
|
|
27
|
-
|
|
28
|
-
**Ferramentas chamadas em paralelo:**
|
|
29
|
-
|
|
30
|
-
1. `Glob` — `internal/**/*.go`
|
|
31
|
-
- **Motivo**: Mapear todos os arquivos Go do projeto para entender a arquitetura existente.
|
|
32
|
-
- **Resultado**: 17 arquivos encontrados cobrindo handler, service, repository, infra (config, database, di, grpc, logger).
|
|
33
|
-
|
|
34
|
-
2. `Glob` — `configs/*.yaml`
|
|
35
|
-
- **Motivo**: Verificar arquivos de configuracao existentes.
|
|
36
|
-
- **Resultado**: 1 arquivo: `configs/config.yaml`.
|
|
37
|
-
|
|
38
|
-
3. `Glob` — `internal/db/migrations/*.sql`
|
|
39
|
-
- **Motivo**: Verificar migracoes existentes.
|
|
40
|
-
- **Resultado**: 1 arquivo: `001_create_usuarios.sql`.
|
|
41
|
-
|
|
42
|
-
4. `Glob` — `internal/db/queries/*.sql`
|
|
43
|
-
- **Motivo**: Verificar queries SQLC existentes.
|
|
44
|
-
- **Resultado**: Nenhum arquivo encontrado (queries podem estar em outro local ou ainda nao existem como arquivos separados).
|
|
45
|
-
|
|
46
|
-
---
|
|
47
|
-
|
|
48
|
-
### 3. Read — Arquivos-chave do codebase (paralelo)
|
|
49
|
-
|
|
50
|
-
**Ferramentas chamadas em paralelo:**
|
|
51
|
-
|
|
52
|
-
1. `Read` — `configs/config.yaml`
|
|
53
|
-
- **Motivo**: Verificar estrutura atual da configuracao (onde `cache.ttl_seconds` sera adicionado).
|
|
54
|
-
- **Resultado**: Config tem campos grpc, database, jwt, log. NAO tem campo cache.
|
|
55
|
-
|
|
56
|
-
2. `Read` — `internal/infra/config/config.go`
|
|
57
|
-
- **Motivo**: Verificar struct Config e como novos campos sao adicionados.
|
|
58
|
-
- **Resultado**: Struct Config com campos GRPCHost, GRPCPort, DatabasePath, JWTSecret, LogLevel. Usa Viper com env prefix APP_.
|
|
59
|
-
|
|
60
|
-
3. `Read` — `internal/infra/di/fx.go`
|
|
61
|
-
- **Motivo**: Verificar composicao de modulos FX existente.
|
|
62
|
-
- **Resultado**: AppModule compoe: config, logger, database, repository, service, grpchandler, grpcserver. NAO tem modulo cache.
|
|
63
|
-
|
|
64
|
-
4. `Read` — `internal/service/user_service.go`
|
|
65
|
-
- **Motivo**: Entender padrao de service existente como referencia.
|
|
66
|
-
- **Resultado**: Padrao: interface publica, struct privada, construtor, modulo FX inline.
|
|
67
|
-
|
|
68
|
-
5. `Read` — `internal/repository/user_repository.go`
|
|
69
|
-
- **Motivo**: Entender padrao de repository existente como referencia.
|
|
70
|
-
- **Resultado**: Padrao: struct de dominio, interface, implementacao com SQLC, mapeamento PT->EN, modulo FX.
|
|
71
|
-
|
|
72
|
-
6. `Read` — `internal/infra/grpc/server.go`
|
|
73
|
-
- **Motivo**: Entender como handlers sao registrados no server gRPC.
|
|
74
|
-
- **Resultado**: Server recebe handlers via FX params, registra com `pb.RegisterXxxServiceServer`.
|
|
75
|
-
|
|
76
|
-
---
|
|
77
|
-
|
|
78
|
-
### 4. Grep — Verificar existencia de modulo Produto e cache (paralelo)
|
|
79
|
-
|
|
80
|
-
**Ferramentas chamadas em paralelo:**
|
|
81
|
-
|
|
82
|
-
1. `Grep` — pattern `product|produto|cardapio|cache` em `*.go`
|
|
83
|
-
- **Motivo**: Verificar se existe qualquer codigo relacionado a produto ou cache.
|
|
84
|
-
- **Resultado**: Apenas 1 match em logger.go (falso positivo). NAO existe modulo de produto nem cache.
|
|
85
|
-
|
|
86
|
-
2. `Grep` — pattern `product|produto|cardapio` em `*.proto`
|
|
87
|
-
- **Motivo**: Verificar se existe proto de produto.
|
|
88
|
-
- **Resultado**: Nenhum match. NAO existe proto de produto.
|
|
89
|
-
|
|
90
|
-
3. `Glob` — `internal/infra/cache/**/*`
|
|
91
|
-
- **Motivo**: Verificar se pacote cache ja existe.
|
|
92
|
-
- **Resultado**: Nenhum arquivo. Pacote NAO existe.
|
|
93
|
-
|
|
94
|
-
4. `Read` — `internal/service/user_service_test.go`
|
|
95
|
-
- **Motivo**: Entender padrao de testes existente (framework, mocks, table-driven).
|
|
96
|
-
- **Resultado**: Usa testify/mock, table-driven tests, MockUserRepository inline, assertNotCalled, assertNumberOfCalls.
|
|
97
|
-
|
|
98
|
-
---
|
|
99
|
-
|
|
100
|
-
### 5. Bash — Criar diretorio de output
|
|
101
|
-
|
|
102
|
-
1. `Bash` — `mkdir -p .../outputs`
|
|
103
|
-
- **Motivo**: Criar estrutura de diretorios para salvar os arquivos de saida do eval.
|
|
104
|
-
- **Resultado**: Diretorio criado com sucesso.
|
|
105
|
-
|
|
106
|
-
---
|
|
107
|
-
|
|
108
|
-
### 6. Write — Salvar response.md
|
|
109
|
-
|
|
110
|
-
1. `Write` — `.../outputs/response.md`
|
|
111
|
-
- **Motivo**: Salvar a resposta completa da interacao inicial.
|
|
112
|
-
- **Resultado**: Arquivo criado com: extracao do nome, analise do codebase, pergunta sobre US/PRD ausentes, pergunta sobre dependencia do modulo Produto, confirmacao pendente.
|
|
113
|
-
|
|
114
|
-
---
|
|
115
|
-
|
|
116
|
-
### 7. Write — Salvar transcript.md
|
|
117
|
-
|
|
118
|
-
1. `Write` — `.../outputs/transcript.md`
|
|
119
|
-
- **Motivo**: Salvar o registro de todas as ferramentas chamadas.
|
|
120
|
-
- **Resultado**: Este arquivo.
|
|
121
|
-
|
|
122
|
-
---
|
|
123
|
-
|
|
124
|
-
## Resumo
|
|
125
|
-
|
|
126
|
-
| Ferramenta | Quantidade de chamadas | Motivo geral |
|
|
127
|
-
|------------|----------------------|--------------|
|
|
128
|
-
| Read | 9 | Skill, templates, arquivos do codebase |
|
|
129
|
-
| Glob | 4 | Explorar estrutura do projeto |
|
|
130
|
-
| Grep | 3 | Verificar existencia de produto/cache |
|
|
131
|
-
| Bash | 1 | Criar diretorios de output |
|
|
132
|
-
| Write | 2 | Salvar response.md e transcript.md |
|
|
133
|
-
| **Total** | **19** | |
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"eval_id": 3,
|
|
3
|
-
"eval_name": "spec-tech-sem-user-stories-explicitas",
|
|
4
|
-
"configuration": "without_skill",
|
|
5
|
-
"expectations": [
|
|
6
|
-
{
|
|
7
|
-
"text": "Detecta a ausencia de User Stories (US-XX) e PRD referenciado no SPEC_TECH",
|
|
8
|
-
"passed": true,
|
|
9
|
-
"evidence": "Secao 2 'Observacoes Preliminares' nota: 'O SPEC_TECH nao referencia User Stories nem PRD.' Tambem detectou que o modulo Product nao existe."
|
|
10
|
-
},
|
|
11
|
-
{
|
|
12
|
-
"text": "PERGUNTA ao usuario sobre User Stories / PRD em vez de inventar ou ignorar",
|
|
13
|
-
"passed": false,
|
|
14
|
-
"evidence": "Nao perguntou ao usuario. Apenas notou a ausencia como observacao e prosseguiu gerando o plano completo com 5 tasks sem interacao."
|
|
15
|
-
},
|
|
16
|
-
{
|
|
17
|
-
"text": "NAO inventa User Stories ficticias (guardrail: nunca invente informacoes)",
|
|
18
|
-
"passed": true,
|
|
19
|
-
"evidence": "Nao inventou User Stories. Derivou criterios diretamente do SPEC_TECH."
|
|
20
|
-
},
|
|
21
|
-
{
|
|
22
|
-
"text": "Extrai corretamente o nome da feature como 'cache-de-cardapio' ou similar em kebab-case",
|
|
23
|
-
"passed": false,
|
|
24
|
-
"evidence": "Usou 'Cache de Cardapio em Memoria' como titulo mas nao normalizou para kebab-case. Nenhuma convencao de nomenclatura aplicada."
|
|
25
|
-
},
|
|
26
|
-
{
|
|
27
|
-
"text": "Segue o processo interativo (uma pergunta por vez, confirma nome antes de prosseguir)",
|
|
28
|
-
"passed": false,
|
|
29
|
-
"evidence": "Nenhum processo interativo. Gerou o plano completo em um unico turno sem perguntas ao usuario."
|
|
30
|
-
}
|
|
31
|
-
]
|
|
32
|
-
}
|
|
@@ -1,248 +0,0 @@
|
|
|
1
|
-
# TASK PLAN -- Cache de Cardapio v1
|
|
2
|
-
|
|
3
|
-
## 1. Identificacao
|
|
4
|
-
|
|
5
|
-
| Campo | Valor |
|
|
6
|
-
|--------------------|--------------------------------|
|
|
7
|
-
| **Feature/Projeto** | Cache de Cardapio em Memoria |
|
|
8
|
-
| **Versao** | v1 |
|
|
9
|
-
| **Data** | 2026-03-07 |
|
|
10
|
-
| **SPEC_TECH** | Cache de Cardapio v1 |
|
|
11
|
-
| **Branch base** | user-feature |
|
|
12
|
-
|
|
13
|
-
---
|
|
14
|
-
|
|
15
|
-
## 2. Observacoes Preliminares
|
|
16
|
-
|
|
17
|
-
O SPEC_TECH nao referencia User Stories nem PRD. Isso implica que:
|
|
18
|
-
- Nao ha criterios de aceitacao formais vindos de um PRD.
|
|
19
|
-
- Os criterios de aceitacao serao derivados diretamente das definicoes tecnicas do SPEC_TECH.
|
|
20
|
-
- Nao ha modulo de Product/Produto implementado no codebase atual. A API possui apenas o modulo User. Portanto, **antes de implementar o cache do cardapio, e necessario que o modulo Product (repository, service, handler, proto, migrations, queries SQLC) ja exista**. Este task plan assume que o modulo Product sera implementado como pre-requisito ou em paralelo.
|
|
21
|
-
|
|
22
|
-
---
|
|
23
|
-
|
|
24
|
-
## 3. Pre-requisitos
|
|
25
|
-
|
|
26
|
-
Antes de iniciar as tasks deste plano, os seguintes itens devem estar prontos:
|
|
27
|
-
|
|
28
|
-
| # | Pre-requisito | Status |
|
|
29
|
-
|---|---------------|--------|
|
|
30
|
-
| P1 | Modulo Product completo (proto, migration, queries SQLC, repository, service, handler) | Pendente -- nao existe no codebase |
|
|
31
|
-
| P2 | Queries SQLC para produtos geradas (`make sqlc`) | Pendente |
|
|
32
|
-
| P3 | Proto de produto gerado (`make proto`) | Pendente |
|
|
33
|
-
|
|
34
|
-
> **Nota:** Se o modulo Product nao existir, as Tasks 4 e 5 nao podem ser implementadas. As Tasks 1-3 (infraestrutura de cache) sao independentes e podem ser feitas antes.
|
|
35
|
-
|
|
36
|
-
---
|
|
37
|
-
|
|
38
|
-
## 4. Tasks
|
|
39
|
-
|
|
40
|
-
### Task 1 -- Adicionar configuracao de cache ao config.yaml e struct Config
|
|
41
|
-
|
|
42
|
-
**Objetivo:** Expor o campo `cache.ttl_seconds` na configuracao da aplicacao.
|
|
43
|
-
|
|
44
|
-
**Arquivos afetados:**
|
|
45
|
-
- `configs/config.yaml`
|
|
46
|
-
- `internal/infra/config/config.go`
|
|
47
|
-
- `internal/infra/config/config_test.go`
|
|
48
|
-
|
|
49
|
-
**Subtasks:**
|
|
50
|
-
|
|
51
|
-
| # | Descricao | Detalhe |
|
|
52
|
-
|---|-----------|---------|
|
|
53
|
-
| 1.1 | Adicionar secao `cache` ao `configs/config.yaml` | Adicionar `cache.ttl_seconds: 300` (valor padrao) |
|
|
54
|
-
| 1.2 | Adicionar campo `CacheTTLSeconds int` na struct `Config` | Em `internal/infra/config/config.go` |
|
|
55
|
-
| 1.3 | Popular o campo via Viper | `v.GetInt("cache.ttl_seconds")` com fallback para 300 se nao configurado |
|
|
56
|
-
| 1.4 | Adicionar teste unitario | Verificar que o valor padrao e 300 e que override via env (`APP_CACHE_TTL_SECONDS`) funciona |
|
|
57
|
-
|
|
58
|
-
**Criterios de aceite:**
|
|
59
|
-
- `Config.CacheTTLSeconds` retorna 300 quando nao configurado.
|
|
60
|
-
- `Config.CacheTTLSeconds` respeita valor do YAML e override via variavel de ambiente.
|
|
61
|
-
- Testes passam.
|
|
62
|
-
|
|
63
|
-
**Estimativa:** P (pequena)
|
|
64
|
-
|
|
65
|
-
---
|
|
66
|
-
|
|
67
|
-
### Task 2 -- Criar pacote de cache generico
|
|
68
|
-
|
|
69
|
-
**Objetivo:** Implementar `internal/infra/cache/` com interface generica `Cache[K, V]` e implementacao `InMemoryCache` usando `sync.Map`.
|
|
70
|
-
|
|
71
|
-
**Arquivos a criar:**
|
|
72
|
-
- `internal/infra/cache/cache.go` -- interface e implementacao
|
|
73
|
-
- `internal/infra/cache/cache_test.go` -- testes unitarios
|
|
74
|
-
- `internal/infra/cache/fx.go` -- modulo FX
|
|
75
|
-
|
|
76
|
-
**Subtasks:**
|
|
77
|
-
|
|
78
|
-
| # | Descricao | Detalhe |
|
|
79
|
-
|---|-----------|---------|
|
|
80
|
-
| 2.1 | Definir interface `Cache[K comparable, V any]` | Metodos: `Get(key K) (V, bool)`, `Set(key K, value V)`, `Invalidate(key K)`, `InvalidateAll()` |
|
|
81
|
-
| 2.2 | Implementar `InMemoryCache[K, V]` | Usar `sync.Map` internamente. Cada entrada armazena o valor e o timestamp de insercao. No `Get`, verificar se `time.Since(timestamp) > ttl`; se sim, deletar e retornar `false`. |
|
|
82
|
-
| 2.3 | Construtor `NewInMemoryCache[K, V](ttl time.Duration) *InMemoryCache[K, V]` | Recebe TTL como parametro |
|
|
83
|
-
| 2.4 | Escrever testes unitarios | Testar: Get/Set basico, expiricao por TTL, Invalidate de chave unica, InvalidateAll |
|
|
84
|
-
| 2.5 | Criar modulo FX (`fx.go`) | Nao registrar provider generico diretamente -- o modulo FX servira como ponto de importacao. A instanciacao concreta sera feita no service ou via factory (ver Task 4). |
|
|
85
|
-
|
|
86
|
-
**Decisoes tecnicas:**
|
|
87
|
-
- `sync.Map` e thread-safe e adequado para cenarios read-heavy (cache de cardapio).
|
|
88
|
-
- Cada entry no map sera um struct `cacheEntry[V]{ value V, createdAt time.Time }`.
|
|
89
|
-
- A verificacao de TTL e lazy (no momento do `Get`), sem goroutine de limpeza periodica em v1.
|
|
90
|
-
|
|
91
|
-
**Criterios de aceite:**
|
|
92
|
-
- Interface `Cache[K, V]` definida e exportada.
|
|
93
|
-
- `InMemoryCache` implementa a interface corretamente.
|
|
94
|
-
- TTL e respeitado: itens expirados nao sao retornados por `Get`.
|
|
95
|
-
- `Invalidate` remove entrada especifica; `InvalidateAll` limpa todo o cache.
|
|
96
|
-
- Testes passam com cobertura dos cenarios listados.
|
|
97
|
-
|
|
98
|
-
**Estimativa:** M (media)
|
|
99
|
-
|
|
100
|
-
---
|
|
101
|
-
|
|
102
|
-
### Task 3 -- Registrar modulo cache no FX (DI)
|
|
103
|
-
|
|
104
|
-
**Objetivo:** Integrar o modulo de cache na composicao de dependencias da aplicacao.
|
|
105
|
-
|
|
106
|
-
**Arquivos afetados:**
|
|
107
|
-
- `internal/infra/di/fx.go`
|
|
108
|
-
- `internal/infra/cache/fx.go` (criado na Task 2)
|
|
109
|
-
|
|
110
|
-
**Subtasks:**
|
|
111
|
-
|
|
112
|
-
| # | Descricao | Detalhe |
|
|
113
|
-
|---|-----------|---------|
|
|
114
|
-
| 3.1 | Criar factory function para cache de produtos | `NewProductCache(cfg *config.Config) *InMemoryCache[string, *repository.Product]` -- usa `cfg.CacheTTLSeconds` para definir o TTL |
|
|
115
|
-
| 3.2 | Registrar no modulo FX do cache | `fx.Provide(NewProductCache)` |
|
|
116
|
-
| 3.3 | Adicionar `cache.Module` ao `AppModule()` em `internal/infra/di/fx.go` | Posicionar entre `config.Module` e `repository.Module` na lista de modulos |
|
|
117
|
-
| 3.4 | Atualizar teste de DI | Verificar que `fx.ValidateApp` passa com o novo modulo |
|
|
118
|
-
|
|
119
|
-
**Dependencias:** Task 1 (config), Task 2 (pacote cache), Pre-requisito P1 (modulo Product -- para o tipo `repository.Product`)
|
|
120
|
-
|
|
121
|
-
**Criterios de aceite:**
|
|
122
|
-
- `cache.Module` esta registrado em `AppModule()`.
|
|
123
|
-
- Aplicacao inicializa sem erros com o novo modulo.
|
|
124
|
-
- Teste de validacao FX passa.
|
|
125
|
-
|
|
126
|
-
**Estimativa:** P (pequena)
|
|
127
|
-
|
|
128
|
-
---
|
|
129
|
-
|
|
130
|
-
### Task 4 -- Integrar cache no ProductService
|
|
131
|
-
|
|
132
|
-
**Objetivo:** Modificar o `ProductService` para consultar cache antes do repository, e invalidar cache em operacoes de escrita.
|
|
133
|
-
|
|
134
|
-
**Arquivos afetados:**
|
|
135
|
-
- `internal/service/product_service.go` (a ser criado no pre-requisito ou modificado se ja existir)
|
|
136
|
-
- `internal/service/product_service_test.go`
|
|
137
|
-
|
|
138
|
-
**Subtasks:**
|
|
139
|
-
|
|
140
|
-
| # | Descricao | Detalhe |
|
|
141
|
-
|---|-----------|---------|
|
|
142
|
-
| 4.1 | Adicionar dependencia de cache ao `productService` | Novo campo `cache cache.Cache[string, *repository.Product]` na struct |
|
|
143
|
-
| 4.2 | Atualizar construtor `NewProductService` | Receber `*InMemoryCache[string, *repository.Product]` como parametro |
|
|
144
|
-
| 4.3 | Implementar cache-aside no `GetProduct` | 1) Consultar `cache.Get(id)`. 2) Se hit, retornar direto. 3) Se miss, buscar no repository, chamar `cache.Set(id, product)`, retornar. |
|
|
145
|
-
| 4.4 | Invalidar cache em `CreateProduct` | Apos insert no repository, chamar `cache.Invalidate(id)` (ou nao popular para evitar inconsistencia) |
|
|
146
|
-
| 4.5 | Invalidar cache em `UpdateProduct` | Apos update no repository, chamar `cache.Invalidate(id)` |
|
|
147
|
-
| 4.6 | Invalidar cache em `DeleteProduct` | Apos delete no repository, chamar `cache.Invalidate(id)` |
|
|
148
|
-
| 4.7 | Adicionar logs de cache hit/miss | `s.logger.Debug("cache hit para produto", zap.String("id", id))` e `s.logger.Debug("cache miss para produto", zap.String("id", id))` |
|
|
149
|
-
| 4.8 | Escrever testes unitarios | Testar: cache hit retorna sem chamar repo, cache miss chama repo e popula cache, create/update/delete invalidam cache |
|
|
150
|
-
|
|
151
|
-
**Dependencias:** Task 2 (pacote cache), Task 3 (DI), Pre-requisito P1 (modulo Product)
|
|
152
|
-
|
|
153
|
-
**Criterios de aceite:**
|
|
154
|
-
- `GetProduct` retorna do cache quando disponivel (sem query ao banco).
|
|
155
|
-
- `GetProduct` busca do repository em cache miss e popula o cache.
|
|
156
|
-
- `CreateProduct`, `UpdateProduct`, `DeleteProduct` invalidam a entrada correspondente no cache.
|
|
157
|
-
- Logs de debug indicam hit/miss.
|
|
158
|
-
- Testes unitarios com mock de cache e mock de repository passam.
|
|
159
|
-
- Nenhuma regressao nos testes existentes.
|
|
160
|
-
|
|
161
|
-
**Estimativa:** M (media)
|
|
162
|
-
|
|
163
|
-
---
|
|
164
|
-
|
|
165
|
-
### Task 5 -- Testes de integracao e validacao final
|
|
166
|
-
|
|
167
|
-
**Objetivo:** Garantir que o fluxo completo funciona end-to-end e que o cache se comporta corretamente sob uso real.
|
|
168
|
-
|
|
169
|
-
**Arquivos afetados:**
|
|
170
|
-
- `internal/service/product_service_test.go` (testes adicionais)
|
|
171
|
-
|
|
172
|
-
**Subtasks:**
|
|
173
|
-
|
|
174
|
-
| # | Descricao | Detalhe |
|
|
175
|
-
|---|-----------|---------|
|
|
176
|
-
| 5.1 | Teste de cenario completo | Criar produto -> Get (cache miss, popula) -> Get novamente (cache hit) -> Update (invalida) -> Get (cache miss novamente) |
|
|
177
|
-
| 5.2 | Teste de expiracao por TTL | Criar produto -> Get (popula cache com TTL curto) -> esperar expiracao -> Get (cache miss) |
|
|
178
|
-
| 5.3 | Teste de concorrencia | Multiplas goroutines fazendo Get simultaneo no mesmo produto -- garantir que nao ha race condition |
|
|
179
|
-
| 5.4 | Rodar `make test` completo | Garantir que nenhum teste existente quebrou |
|
|
180
|
-
| 5.5 | Rodar `make build` | Garantir que a compilacao passa |
|
|
181
|
-
|
|
182
|
-
**Dependencias:** Tasks 1-4 completas
|
|
183
|
-
|
|
184
|
-
**Criterios de aceite:**
|
|
185
|
-
- Todos os cenarios de teste passam.
|
|
186
|
-
- `go test -race ./internal/...` nao detecta race conditions.
|
|
187
|
-
- `make build` e `make test` passam sem erros.
|
|
188
|
-
|
|
189
|
-
**Estimativa:** M (media)
|
|
190
|
-
|
|
191
|
-
---
|
|
192
|
-
|
|
193
|
-
## 5. Ordem de Execucao e Dependencias
|
|
194
|
-
|
|
195
|
-
```
|
|
196
|
-
Task 1 (Config) ─────┐
|
|
197
|
-
├──> Task 3 (DI) ──> Task 4 (Service) ──> Task 5 (Validacao)
|
|
198
|
-
Task 2 (Cache pkg) ──┘
|
|
199
|
-
```
|
|
200
|
-
|
|
201
|
-
- Tasks 1 e 2 podem ser executadas **em paralelo**.
|
|
202
|
-
- Task 3 depende de Tasks 1 e 2.
|
|
203
|
-
- Task 4 depende de Task 3 e do pre-requisito P1 (modulo Product).
|
|
204
|
-
- Task 5 depende de Task 4.
|
|
205
|
-
|
|
206
|
-
---
|
|
207
|
-
|
|
208
|
-
## 6. Resumo de Estimativas
|
|
209
|
-
|
|
210
|
-
| Task | Descricao | Estimativa | Dependencias |
|
|
211
|
-
|------|-----------|------------|--------------|
|
|
212
|
-
| 1 | Config de cache | P (pequena) | Nenhuma |
|
|
213
|
-
| 2 | Pacote cache generico | M (media) | Nenhuma |
|
|
214
|
-
| 3 | Registro no FX (DI) | P (pequena) | Tasks 1, 2, P1 |
|
|
215
|
-
| 4 | Integracao no ProductService | M (media) | Task 3, P1 |
|
|
216
|
-
| 5 | Testes e validacao | M (media) | Task 4 |
|
|
217
|
-
|
|
218
|
-
**Esforco total estimado:** ~1.5 a 2 dias de desenvolvimento.
|
|
219
|
-
|
|
220
|
-
---
|
|
221
|
-
|
|
222
|
-
## 7. Riscos e Consideracoes
|
|
223
|
-
|
|
224
|
-
| # | Risco | Mitigacao |
|
|
225
|
-
|---|-------|-----------|
|
|
226
|
-
| R1 | Modulo Product nao existe no codebase -- bloqueia Tasks 3-5 | Implementar modulo Product antes ou em paralelo. Tasks 1-2 sao independentes. |
|
|
227
|
-
| R2 | `sync.Map` nao suporta generics nativamente (usa `any` internamente) | Wrapper tipado com type assertions no `InMemoryCache`. Testes garantem type safety. |
|
|
228
|
-
| R3 | Lazy expiration pode acumular entradas expiradas em memoria | Aceitavel em v1 para um cardapio pequeno. Em v2, considerar goroutine de limpeza periodica. |
|
|
229
|
-
| R4 | Cache pode servir dados stale em cenarios de escrita concorrente | Invalidacao sincrona no mesmo request de escrita mitiga isso. TTL garante convergencia eventual. |
|
|
230
|
-
| R5 | Sem metricas de cache (hit rate, tamanho) | Fora de escopo em v1. Considerar para v2. |
|
|
231
|
-
|
|
232
|
-
---
|
|
233
|
-
|
|
234
|
-
## 8. Arquivos Criados/Modificados (Resumo)
|
|
235
|
-
|
|
236
|
-
### Novos arquivos:
|
|
237
|
-
- `internal/infra/cache/cache.go`
|
|
238
|
-
- `internal/infra/cache/cache_test.go`
|
|
239
|
-
- `internal/infra/cache/fx.go`
|
|
240
|
-
|
|
241
|
-
### Arquivos modificados:
|
|
242
|
-
- `configs/config.yaml` -- adicionar secao `cache`
|
|
243
|
-
- `internal/infra/config/config.go` -- adicionar campo `CacheTTLSeconds`
|
|
244
|
-
- `internal/infra/config/config_test.go` -- testes do novo campo
|
|
245
|
-
- `internal/infra/di/fx.go` -- registrar `cache.Module`
|
|
246
|
-
- `internal/infra/di/fx_test.go` -- atualizar teste de validacao
|
|
247
|
-
- `internal/service/product_service.go` -- integrar cache (requer que o arquivo exista)
|
|
248
|
-
- `internal/service/product_service_test.go` -- testes de cache no service
|