adi_dev_workflow 1.1.1 → 1.3.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/bin/index.js +8 -8
- package/frameworks/agents/qa-staff-engineer.md +311 -311
- package/frameworks/agents/qa-validation-expert.md +458 -458
- package/frameworks/agents/tech-review-conformance.md +200 -200
- package/frameworks/commands/ministack/README.md +2 -0
- package/frameworks/commands/ministack/code-review.md +2 -0
- package/frameworks/commands/ministack/generate-intent.md +2 -0
- package/frameworks/commands/ministack/generate-scope.md +2 -0
- package/frameworks/commands/ministack/generate-tasks.md +2 -0
- package/frameworks/commands/ministack/generate-tech-direction.md +2 -0
- package/frameworks/commands/ministack/run-ministack-tasks.md +3 -0
- package/frameworks/commands/ministack/run-ministack-withlinear.md +2 -0
- package/frameworks/commands/ministack/status.md +2 -0
- package/frameworks/commands/sdd/code-review.md +2 -0
- package/frameworks/commands/sdd/generate-prd.md +2 -0
- package/frameworks/commands/sdd/generate-task-plan.md +2 -0
- package/frameworks/commands/sdd/generate-tech-direction.md +2 -0
- package/frameworks/commands/sdd/generate-tech-spec.md +2 -0
- package/frameworks/commands/sdd/generate-tests.md +2 -0
- package/frameworks/commands/sdd/run_tasks.md +3 -0
- package/frameworks/commands/sdd/run_tasks_withlinear.md +2 -0
- package/frameworks/commands/sdd/status.md +2 -0
- package/frameworks/commands/sdd/validate-sdd.md +2 -0
- package/frameworks/commands/sync-tasks-to-linear.md +2 -0
- package/frameworks/commands/taskcard/generate-taskcard.md +2 -0
- package/frameworks/commands/taskcard/run-taskcard.md +2 -0
- package/frameworks/config/ai-framework-config.yaml +112 -0
- package/frameworks/skills/ministack-tasks-expert/SKILL.md +204 -204
- package/frameworks/skills/ministack-tasks-expert/templates/task_plan_template.md +78 -78
- package/frameworks/skills/ministack-tasks-expert/templates/task_template.md +103 -103
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/benchmark.json +99 -99
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/benchmark.md +64 -64
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/eval_metadata.json +12 -12
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/with_skill/grading.json +32 -32
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/with_skill/outputs/response.md +134 -134
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/with_skill/outputs/transcript.md +68 -68
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/with_skill/timing.json +5 -5
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/without_skill/grading.json +32 -32
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/without_skill/outputs/response.md +525 -525
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/without_skill/outputs/transcript.md +30 -30
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-1-happy-path/without_skill/timing.json +5 -5
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/eval_metadata.json +12 -12
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/with_skill/grading.json +32 -32
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/with_skill/outputs/response.md +1126 -1126
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/with_skill/outputs/transcript.md +131 -131
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/with_skill/timing.json +5 -5
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/without_skill/grading.json +32 -32
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/without_skill/outputs/response.md +452 -452
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/without_skill/outputs/transcript.md +78 -78
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-2-spec-simples/without_skill/timing.json +5 -5
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/eval_metadata.json +12 -12
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/with_skill/grading.json +32 -32
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/with_skill/outputs/response.md +101 -101
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/with_skill/outputs/transcript.md +133 -133
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/with_skill/timing.json +5 -5
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/without_skill/grading.json +32 -32
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/without_skill/outputs/response.md +248 -248
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/without_skill/outputs/transcript.md +49 -49
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/without_skill/timing.json +5 -5
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-1/review.html +1325 -1325
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/benchmark.json +94 -94
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/benchmark.md +67 -67
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/eval_metadata.json +12 -12
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/with_skill/grading.json +32 -32
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/with_skill/outputs/response.md +117 -117
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/with_skill/outputs/transcript.md +91 -91
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/with_skill/timing.json +1 -1
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/without_skill/grading.json +32 -32
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/without_skill/outputs/response.md +694 -694
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/without_skill/outputs/transcript.md +45 -45
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-1-happy-path/without_skill/timing.json +1 -1
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/eval_metadata.json +12 -12
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/with_skill/grading.json +32 -32
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/with_skill/outputs/response.md +1087 -1087
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/with_skill/outputs/transcript.md +124 -124
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/with_skill/timing.json +1 -1
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/without_skill/grading.json +32 -32
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/without_skill/outputs/response.md +458 -458
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/without_skill/outputs/transcript.md +84 -84
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-2-spec-simples/without_skill/timing.json +1 -1
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/eval_metadata.json +12 -12
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/with_skill/grading.json +32 -32
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/with_skill/outputs/response.md +70 -70
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/with_skill/outputs/transcript.md +148 -148
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/with_skill/timing.json +1 -1
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/without_skill/grading.json +32 -32
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/without_skill/outputs/response.md +249 -249
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/without_skill/outputs/transcript.md +80 -80
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/eval-3-sem-user-stories/without_skill/timing.json +1 -1
- package/frameworks/skills/sdd-task-plan-expert-workspace/iteration-2/review.html +1325 -1325
- package/frameworks/skills/sdd-tech-spec-expert/SKILL.md +317 -317
- package/frameworks/skills/sdd-tech-spec-expert/evals/evals.json +199 -199
- package/frameworks/skills/sdd-tech-spec-expert/templates/spec_tech_template.md +290 -290
- package/frameworks/skills/sdd-tech-spec-expert/templates/tech_direction-template.md +23 -23
- package/package.json +28 -28
- package/src/cli.js +121 -121
- package/src/installer.js +155 -136
- package/src/transformer.js +86 -86
|
@@ -1,248 +1,248 @@
|
|
|
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
|
|
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
|
|
@@ -1,49 +1,49 @@
|
|
|
1
|
-
# Transcript -- Task Plan Generation (Cache de Cardapio v1, without_skill)
|
|
2
|
-
|
|
3
|
-
## Ferramentas chamadas
|
|
4
|
-
|
|
5
|
-
### 1. ToolSearch (select:Bash,Read,Glob,Write)
|
|
6
|
-
- **Motivo:** Carregar ferramentas necessarias para explorar o codebase e gerar os arquivos de saida.
|
|
7
|
-
|
|
8
|
-
### 2. Glob (3 chamadas em paralelo)
|
|
9
|
-
- `internal/**/*.go` -- Listar todos os arquivos Go do projeto para entender a estrutura.
|
|
10
|
-
- `configs/*.yaml` -- Localizar arquivo de configuracao.
|
|
11
|
-
- `internal/db/migrations/*.sql` -- Listar migracoes existentes.
|
|
12
|
-
|
|
13
|
-
**Resultado:** Identificou que o projeto possui apenas o modulo User (repository, service, handler). Nao ha modulo Product.
|
|
14
|
-
|
|
15
|
-
### 3. Read (5 chamadas em paralelo)
|
|
16
|
-
- `configs/config.yaml` -- Entender configuracao atual (grpc, database, jwt, log). Nao ha secao cache.
|
|
17
|
-
- `internal/infra/config/config.go` -- Entender struct Config e como Viper mapeia campos. Campo `CacheTTLSeconds` nao existe.
|
|
18
|
-
- `internal/infra/di/fx.go` -- Entender composicao DI. Modulos: config, logger, database, repository, service, handlers, grpc.
|
|
19
|
-
- `internal/service/user_service.go` -- Entender padrao do service layer (interface + impl privada + modulo FX).
|
|
20
|
-
- `internal/repository/user_repository.go` -- Entender padrao do repository (interface + SQLC + mapeamento pt->en + modulo FX).
|
|
21
|
-
|
|
22
|
-
### 4. ToolSearch (select:Grep)
|
|
23
|
-
- **Motivo:** Carregar ferramenta de busca para verificar existencia de codigo de Product.
|
|
24
|
-
|
|
25
|
-
### 5. Grep (product|Product|produto|Produto em arquivos .go)
|
|
26
|
-
- **Resultado:** Nenhuma referencia significativa a Product/Produto no codigo Go. Confirmou que o modulo Product nao existe.
|
|
27
|
-
|
|
28
|
-
### 6. Read (2 chamadas em paralelo)
|
|
29
|
-
- `internal/infra/grpc/server.go` -- Entender como handlers sao registrados no servidor gRPC.
|
|
30
|
-
- `internal/service/user_service_test.go` -- Entender padrao de testes (table-driven, mocks com testify).
|
|
31
|
-
|
|
32
|
-
### 7. Bash (mkdir)
|
|
33
|
-
- Criar diretorio de saida: `.claude/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/without_skill/outputs/`
|
|
34
|
-
|
|
35
|
-
### 8. Write (response.md)
|
|
36
|
-
- Gerar o Task Plan completo com 5 tasks, pre-requisitos, dependencias, riscos e estimativas.
|
|
37
|
-
|
|
38
|
-
### 9. Write (transcript.md)
|
|
39
|
-
- Gerar este arquivo de transcript.
|
|
40
|
-
|
|
41
|
-
## Decisoes tomadas
|
|
42
|
-
|
|
43
|
-
1. **Modulo Product como pre-requisito:** O SPEC_TECH menciona "cardapio de produtos" e "ProductService", mas nenhum codigo de Product existe. Decidi documentar isso como pre-requisito bloqueante (P1) em vez de incluir a criacao do modulo Product inteiro no task plan, pois esta fora do escopo do SPEC_TECH.
|
|
44
|
-
|
|
45
|
-
2. **Sem User Stories / PRD:** O SPEC_TECH nao referencia User Stories nem PRD. Derivei criterios de aceite diretamente das definicoes tecnicas do SPEC_TECH. Registrei essa observacao na secao 2 do task plan.
|
|
46
|
-
|
|
47
|
-
3. **Generics em Go:** O SPEC_TECH pede `Cache[K, V]` generico. Go 1.24 suporta generics, entao a interface e implementacao usam type parameters. Porem `sync.Map` usa `any` internamente, entao o wrapper tipado faz type assertions.
|
|
48
|
-
|
|
49
|
-
4. **Lazy expiration:** Decidi por verificacao de TTL no momento do `Get` (sem goroutine de cleanup), conforme adequado para v1 de um cardapio pequeno.
|
|
1
|
+
# Transcript -- Task Plan Generation (Cache de Cardapio v1, without_skill)
|
|
2
|
+
|
|
3
|
+
## Ferramentas chamadas
|
|
4
|
+
|
|
5
|
+
### 1. ToolSearch (select:Bash,Read,Glob,Write)
|
|
6
|
+
- **Motivo:** Carregar ferramentas necessarias para explorar o codebase e gerar os arquivos de saida.
|
|
7
|
+
|
|
8
|
+
### 2. Glob (3 chamadas em paralelo)
|
|
9
|
+
- `internal/**/*.go` -- Listar todos os arquivos Go do projeto para entender a estrutura.
|
|
10
|
+
- `configs/*.yaml` -- Localizar arquivo de configuracao.
|
|
11
|
+
- `internal/db/migrations/*.sql` -- Listar migracoes existentes.
|
|
12
|
+
|
|
13
|
+
**Resultado:** Identificou que o projeto possui apenas o modulo User (repository, service, handler). Nao ha modulo Product.
|
|
14
|
+
|
|
15
|
+
### 3. Read (5 chamadas em paralelo)
|
|
16
|
+
- `configs/config.yaml` -- Entender configuracao atual (grpc, database, jwt, log). Nao ha secao cache.
|
|
17
|
+
- `internal/infra/config/config.go` -- Entender struct Config e como Viper mapeia campos. Campo `CacheTTLSeconds` nao existe.
|
|
18
|
+
- `internal/infra/di/fx.go` -- Entender composicao DI. Modulos: config, logger, database, repository, service, handlers, grpc.
|
|
19
|
+
- `internal/service/user_service.go` -- Entender padrao do service layer (interface + impl privada + modulo FX).
|
|
20
|
+
- `internal/repository/user_repository.go` -- Entender padrao do repository (interface + SQLC + mapeamento pt->en + modulo FX).
|
|
21
|
+
|
|
22
|
+
### 4. ToolSearch (select:Grep)
|
|
23
|
+
- **Motivo:** Carregar ferramenta de busca para verificar existencia de codigo de Product.
|
|
24
|
+
|
|
25
|
+
### 5. Grep (product|Product|produto|Produto em arquivos .go)
|
|
26
|
+
- **Resultado:** Nenhuma referencia significativa a Product/Produto no codigo Go. Confirmou que o modulo Product nao existe.
|
|
27
|
+
|
|
28
|
+
### 6. Read (2 chamadas em paralelo)
|
|
29
|
+
- `internal/infra/grpc/server.go` -- Entender como handlers sao registrados no servidor gRPC.
|
|
30
|
+
- `internal/service/user_service_test.go` -- Entender padrao de testes (table-driven, mocks com testify).
|
|
31
|
+
|
|
32
|
+
### 7. Bash (mkdir)
|
|
33
|
+
- Criar diretorio de saida: `.claude/skills/sdd-task-plan-expert-workspace/iteration-1/eval-3-sem-user-stories/without_skill/outputs/`
|
|
34
|
+
|
|
35
|
+
### 8. Write (response.md)
|
|
36
|
+
- Gerar o Task Plan completo com 5 tasks, pre-requisitos, dependencias, riscos e estimativas.
|
|
37
|
+
|
|
38
|
+
### 9. Write (transcript.md)
|
|
39
|
+
- Gerar este arquivo de transcript.
|
|
40
|
+
|
|
41
|
+
## Decisoes tomadas
|
|
42
|
+
|
|
43
|
+
1. **Modulo Product como pre-requisito:** O SPEC_TECH menciona "cardapio de produtos" e "ProductService", mas nenhum codigo de Product existe. Decidi documentar isso como pre-requisito bloqueante (P1) em vez de incluir a criacao do modulo Product inteiro no task plan, pois esta fora do escopo do SPEC_TECH.
|
|
44
|
+
|
|
45
|
+
2. **Sem User Stories / PRD:** O SPEC_TECH nao referencia User Stories nem PRD. Derivei criterios de aceite diretamente das definicoes tecnicas do SPEC_TECH. Registrei essa observacao na secao 2 do task plan.
|
|
46
|
+
|
|
47
|
+
3. **Generics em Go:** O SPEC_TECH pede `Cache[K, V]` generico. Go 1.24 suporta generics, entao a interface e implementacao usam type parameters. Porem `sync.Map` usa `any` internamente, entao o wrapper tipado faz type assertions.
|
|
48
|
+
|
|
49
|
+
4. **Lazy expiration:** Decidi por verificacao de TTL no momento do `Get` (sem goroutine de cleanup), conforme adequado para v1 de um cardapio pequeno.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
{
|
|
2
|
-
"total_tokens": 34322,
|
|
3
|
-
"duration_ms": 144659,
|
|
4
|
-
"total_duration_seconds": 144.7
|
|
5
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"total_tokens": 34322,
|
|
3
|
+
"duration_ms": 144659,
|
|
4
|
+
"total_duration_seconds": 144.7
|
|
5
|
+
}
|