This commit is contained in:
Carlos Correia
2026-05-29 11:03:29 +01:00
parent 967584f083
commit fee538eebd
14 changed files with 1349 additions and 1149 deletions

View File

@@ -1,115 +1,93 @@
# ⚙️ Rule Engine — Regras de Recomendação (MVP)
# Regras do Sistema de Sugestão
## Propósito
## Estado atual
Define as regras estáticas que o motor de recomendações segue para sugerir itens ao utilizador.
O DayMaker não usa atualmente um motor de regras local como fonte principal de recomendações.
A sugestão é gerada pela IA através de `AiRecommendationService`, usando o inventário real do utilizador como contexto.
---
## Regras Ativas (MVP)
## Regras ativas
### R1 — Filtragem por Context Tags
```
IF item.contextTags contém pelo menos uma tag do contexto
THEN item é relevante
### R1 — Usar apenas inventário do utilizador
A IA recebe apenas itens do utilizador autenticado.
```text
items.user_id == currentUser.id
```
### R2 — Ordenação por Prioridade de Categoria
```
Ordenar itens pela posição da categoria em context.priorityCategories
Categorias fora da lista → prioridade baixa (999)
```
### R2 — Contexto textual dos itens
### R3 — Limite de Itens
```
Retornar no máximo context.maxItems itens
```
Cada item é enviado com:
| Contexto | maxItems |
|----------|----------|
| travel_short | 20 |
| travel_long | 40 |
| work | 15 |
| casual | 10 |
| sport | 8 |
| outdoor | 12 |
- nome
- categoria
- tags
- nota/notes, quando disponível
### R4Interpretação de Pedido (Parser)
```
Palavras-chave → contexto + duração + clima + formalidade
### R3Modo silencioso para sugestões
viagem/comboio/voo → travel_short + transit
trabalho/reunião → work + indoor
fim de semana/casual/lazer → casual
treino/desporto/gym → sport
exterior/caminhada → outdoor + outdoor
Quando a sugestão vem da Home, o serviço usa `silent: true` e instrui a IA a responder apenas com nomes exatos dos itens.
4+ dias/semana/longa → duration:long + upgrade para travel_long
4 horas/média → duration:medium
1-2 horas/curta → duration:short
### R4 — Correspondência com itens reais
frio/inverno → weather:cold
calor/verão/praia → weather:hot
chuva → weather:rainy
A app cruza as linhas devolvidas pela IA com os nomes dos itens carregados do Supabase.
formal/cerimónia → formality:formal
casual/informal → formality:casual
```
Apenas itens correspondidos são mostrados com imagem e podem ser exportados.
### R5 — Exportação para semana
Ao exportar:
1. A app cria ou encontra um registo em `plans` para o dia escolhido.
2. Insere relações em `plan_items`.
3. Evita duplicados já existentes no plano.
---
## Regras Pendentes (a implementar)
## Limitações atuais
### R5 — Filtro por Duração
```
IF duration == short → apenas essenciais (documents, cables, 1x clothing)
IF duration == medium → essenciais + entretenimento
IF duration == long → essenciais + entretenimento + conforto extra
```
**Estado:** Não implementado no MVP atual. Duração é detetada mas não filtra.
### R6 — Filtro por Clima
```
IF weather == cold → priorizar outerwear, remover beach/hot items
IF weather == hot → priorizar roupa leve, remover cold items
IF weather == rainy → priorizar outerwear + accessories.impermeável
```
**Estado:** Clima é detetado mas não filtra itens no MVP.
### R7 — Filtro por Formalidade
```
IF formality == formal → priorizar clothing.formal, footwear.formal
IF formality == casual → excluir clothing.formal
```
**Estado:** Formalidade é detetada mas não filtra itens no MVP.
- A IA pode devolver nomes com pequenas diferenças.
- O matching é textual e pode falhar se o nome não coincidir.
- Não existe ranking local por categoria, clima ou duração.
- Não existe checklist de itens preparados.
---
## Mapeamento de Context Tags (04_CATEGORIES_AND_TAGS.md)
## Regras futuras recomendadas
| Categoria.Subcategoria | Context Tags |
|------------------------|-------------|
| clothing.formal | work, formal |
| clothing.casual | casual, travel |
| clothing.sportswear | sport |
| clothing.outerwear | travel, cold, outdoor |
| electronics.computers | work, travel |
| electronics.phones | travel, work, casual |
| electronics.cables | travel |
| electronics.gaming | casual, travel |
| footwear.formal | work, formal |
| footwear.casual | casual, travel |
| footwear.sport | sport |
| footwear.outdoor | outdoor, travel |
| accessories.bags | travel, work, casual |
| documents.identity | travel |
| documents.travel | travel |
### RF1 — Resposta estruturada
Pedir à IA JSON com identificadores ou nomes normalizados.
### RF2 — Score local
Calcular pontuação por:
- categoria
- tags
- ocasião
- histórico do utilizador
- clima
### RF3 — Checklist
Guardar estado de cada item planeado:
- planeado
- preparado
- levado
### RF4 — Clima
Ajustar sugestões quando houver dados meteorológicos.
---
## Notas para o Agente
## Notas para manutenção
- **NÃO** adicionar regras novas sem validar com o utilizador
- As regras R5-R7 estão identificadas como pendentes — implementar quando o MVP base estiver estável
- O parser de palavras-chave (R4) é temporário — Fase 2 substitui por OpenAI
- Sempre que uma regra pendente for implementada, atualizar este ficheiro e o AI_AGENTS_LOG.md
- Não mudar o comportamento do modo `silent` sem atualizar `05_RECOMMENDATION_ENGINE.md`.
- Se a app passar a usar IDs na resposta da IA, atualizar este ficheiro e o serviço.
- Manter a exportação compatível com `plans` e `plan_items`.