MVP
This commit is contained in:
@@ -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
|
||||
|
||||
### R4 — Interpretação de Pedido (Parser)
|
||||
```
|
||||
Palavras-chave → contexto + duração + clima + formalidade
|
||||
### R3 — Modo 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`.
|
||||
|
||||
Reference in New Issue
Block a user