Skip to content

Latest commit

Β 

History

History
833 lines (685 loc) Β· 27.3 KB

File metadata and controls

833 lines (685 loc) Β· 27.3 KB

User Stories β€” MVP

ConvenΓ§Γ΅es para Desenvolvimento por Agente

Formato de User Story

US-XX: [TΓ­tulo]
Como [persona], eu quero [aΓ§Γ£o] para [benefΓ­cio].

Acceptance Criteria:
- [ ] AC-1: ...
- [ ] AC-2: ...

Technical Notes:
- ImplementaΓ§Γ£o: ...
- DependΓͺncias: ...
- Testes requeridos: ...

Definition of Done:
- [ ] CΓ³digo implementado
- [ ] Testes unitΓ‘rios (β‰₯80% coverage)
- [ ] Testes de integraΓ§Γ£o
- [ ] DocumentaΓ§Γ£o atualizada
- [ ] PR aprovado e merged

Regras para Agentes

  1. Cada PR deve conter:

    • CΓ³digo funcional
    • Testes unitΓ‘rios e de integraΓ§Γ£o
    • AtualizaΓ§Γ£o de documentaΓ§Γ£o
    • Exemplos de uso (quando aplicΓ‘vel)
  2. Commits seguem Conventional Commits:

    • feat: nova funcionalidade
    • fix: correΓ§Γ£o de bug
    • test: adiΓ§Γ£o de testes
    • docs: documentaΓ§Γ£o
    • refactor: refatoraΓ§Γ£o sem mudanΓ§a de comportamento
  3. Ordem de implementaΓ§Γ£o: Seguir numeraΓ§Γ£o US-XX


Epic 1: Setup e Infraestrutura

US-01: Estrutura do RepositΓ³rio

Como desenvolvedor, eu quero um repositΓ³rio bem estruturado para comeΓ§ar o desenvolvimento com boas prΓ‘ticas.

Acceptance Criteria:

  • AC-1: Monorepo com pastas backend/, frontend/, docs/
  • AC-2: .gitignore configurado (venv, node_modules, .env, pycache, etc.)
  • AC-3: README.md com instruΓ§Γ΅es de setup
  • AC-4: .env.example com variΓ‘veis necessΓ‘rias
  • AC-5: docker-compose.yml para desenvolvimento local

Technical Notes:

  • Backend: Python 3.12+, FastAPI
  • Frontend: Node 20+, Next.js 14+
  • Estrutura de pastas seguindo convenΓ§Γ΅es de cada framework

Arquivos a criar:

β”œβ”€β”€ backend/
β”‚   β”œβ”€β”€ app/
β”‚   β”‚   β”œβ”€β”€ __init__.py
β”‚   β”‚   β”œβ”€β”€ main.py
β”‚   β”‚   └── config.py
β”‚   β”œβ”€β”€ tests/
β”‚   β”‚   └── __init__.py
β”‚   β”œβ”€β”€ requirements.txt
β”‚   β”œβ”€β”€ requirements-dev.txt
β”‚   β”œβ”€β”€ Dockerfile
β”‚   └── .env.example
β”œβ”€β”€ frontend/
β”‚   β”œβ”€β”€ src/
β”‚   β”‚   └── app/
β”‚   β”œβ”€β”€ package.json
β”‚   β”œβ”€β”€ Dockerfile
β”‚   └── .env.example
β”œβ”€β”€ docs/
β”‚   └── domain.md
β”œβ”€β”€ docker-compose.yml
β”œβ”€β”€ .gitignore
β”œβ”€β”€ .env.example
└── README.md

Definition of Done:

  • Estrutura criada
  • docker compose up funciona
  • Backend responde em /health
  • Frontend carrega pΓ‘gina inicial

US-02: CI/CD Pipeline

Como desenvolvedor, eu quero um pipeline de CI/CD para garantir qualidade a cada commit.

Acceptance Criteria:

  • AC-1: GitHub Actions workflow configurado
  • AC-2: Lint (ruff/eslint) roda em cada PR
  • AC-3: Testes unitΓ‘rios rodam em cada PR
  • AC-4: Build verifica que cΓ³digo compila
  • AC-5: Branch protection em main requer PR aprovado

Technical Notes:

  • Backend: ruff (lint + format), pytest
  • Frontend: eslint, prettier, vitest ou jest
  • Workflow: .github/workflows/ci.yml

Arquivos a criar:

β”œβ”€β”€ .github/
β”‚   └── workflows/
β”‚       └── ci.yml
β”œβ”€β”€ backend/
β”‚   β”œβ”€β”€ pyproject.toml (ou ruff.toml)
β”‚   └── pytest.ini
β”œβ”€β”€ frontend/
β”‚   β”œβ”€β”€ .eslintrc.json
β”‚   └── .prettierrc

Definition of Done:

  • Workflow executa com sucesso
  • PR com erro de lint Γ© bloqueado
  • PR com teste falhando Γ© bloqueado

Epic 2: NSR Engine (Core)

US-03: Modelo de DomΓ­nio Base (CaraΓ­ba)

Como desenvolvedor, eu quero entidades de domΓ­nio bem definidas para ter uma base sΓ³lida para cΓ‘lculos NSR da Mina CaraΓ­ba.

Acceptance Criteria:

  • AC-1: Entidade Mine com (name, areas: List[Area])
  • AC-2: Entidade Area com (name, mine_method: UG|OP, recovery_params)
  • AC-3: Entidade RecoveryParams com (a, b, fixed) para fΓ³rmula linear: recovery = a Γ— grade + b
  • AC-4: Entidade Metal com (code: Cu|Au|Ag, price, price_unit, is_byproduct)
  • AC-5: Entidade HeadGrades com (cu_grade, au_grade, ag_grade, units)
  • AC-6: Entidade MineFactors com (dilution, ore_recovery)
  • AC-7: Entidade CommercialTerms com (payability, tc, rc, freight, penalties) por metal
  • AC-8: Entidade PriceDeck com cenΓ‘rios (Mineral Resources, Reserves, Consensus)
  • AC-9: Entidade NSRResult com breakdown multi-metal
  • AC-10: Todas entidades com validaΓ§Γ£o via Pydantic
  • AC-11: Seed data com minas/Γ‘reas de CaraΓ­ba (ver NSR_REQUIREMENTS.md)
  • AC-12: DocumentaΓ§Γ£o do domΓ­nio em docs/domain.md

ReferΓͺncia: Ver NSR_REQUIREMENTS.md para lista completa de minas, Γ‘reas e fΓ³rmulas.

Technical Notes:

  • Usar Pydantic BaseModel para todas entidades
  • Unidades explΓ­citas (USD, USD/oz, USD/lb, etc.)
  • Suportar conversΓ΅es de unidade comuns

Arquivos a criar/modificar:

backend/app/
β”œβ”€β”€ domain/
β”‚   β”œβ”€β”€ __init__.py
β”‚   β”œβ”€β”€ metal.py
β”‚   β”œβ”€β”€ ore.py
β”‚   β”œβ”€β”€ terms.py
β”‚   └── result.py
docs/
└── domain.md

Definition of Done:

  • Entidades implementadas
  • Testes unitΓ‘rios para validaΓ§Γ΅es
  • DocumentaΓ§Γ£o do domΓ­nio completa

US-04: FunΓ§Γ£o compute_cu_recovery e compute_payable_metal

Como NSR Engine, eu preciso calcular a recuperaΓ§Γ£o de Cu e o metal pagΓ‘vel para determinar a quantidade de metal que gera receita.

Acceptance Criteria:

  • AC-1: FunΓ§Γ£o compute_cu_recovery(grade, area) calcula recuperaΓ§Γ£o por fΓ³rmula linear
  • AC-2: FΓ³rmula de recuperaΓ§Γ£o: recovery = a Γ— grade + b (parΓ’metros por Γ‘rea)
  • AC-3: Suportar valor fixo de recuperaΓ§Γ£o quando especificado
  • AC-4: FΓ³rmula payable: payable_metal = tonnage Γ— grade Γ— recovery Γ— payability
  • AC-5: Suportar conversΓ£o de unidades (%, ppm, g/t β†’ fraΓ§Γ£o)
  • AC-6: Validar inputs (valores positivos, recovery/payability ≀ 100%)
  • AC-7: Retornar objeto com valor + unidade + fΓ³rmula aplicada
  • AC-8: FunΓ§Γ£o pura (sem side effects)

Technical Notes:

  • LocalizaΓ§Γ£o: backend/app/nsr_engine/calculations.py
  • ParΓ’metros de recuperaΓ§Γ£o por Γ‘rea em backend/app/nsr_engine/recovery_params.py
  • Testes com casos conhecidos de Excel CaraΓ­ba

ParΓ’metros de recuperaΓ§Γ£o (seed data):

RECOVERY_PARAMS = {
    "Vermelhos Sul": {"a": 2.8286, "b": 92.584, "fixed": None},
    "UG03": {"a": 2.8286, "b": 92.584, "fixed": None},
    "Deepening Above - 965": {"a": 4.0851, "b": 90.346, "fixed": 92.9},
    "MSBSUL": {"a": 7.5986, "b": 85.494, "fixed": 90.0},
    # ... ver NSR_REQUIREMENTS.md para lista completa
}

Exemplo de uso:

# Calcular recuperaΓ§Γ£o
recovery = compute_cu_recovery(
    cu_grade=1.4,  # %
    area="Vermelhos Sul"
)
# recovery = 2.8286 Γ— 1.4 + 92.584 = 96.544%

# Calcular metal pagΓ‘vel
result = compute_payable_metal(
    tonnage=1000,        # tonnes
    grade=1.4,           # % Cu
    recovery=0.96544,    # calculado acima
    payability=0.9665    # 96.65%
)
# result.value = ... tonnes Cu payable

Definition of Done:

  • FunΓ§Γ΅es implementadas
  • β‰₯ 5 testes unitΓ‘rios para cada funΓ§Γ£o
  • ParΓ’metros de recuperaΓ§Γ£o para todas Γ‘reas de CaraΓ­ba
  • ValidaΓ§Γ£o de inputs
  • Docstring com fΓ³rmulas

US-05: FunΓ§Γ£o compute_gross_revenue

Como NSR Engine, eu preciso calcular a receita bruta para determinar o valor mΓ‘ximo antes de deduΓ§Γ΅es.

Acceptance Criteria:

  • AC-1: FΓ³rmula: gross_revenue = payable_metal Γ— price
  • AC-2: Suportar preΓ§os em diferentes unidades (USD/oz, USD/lb, USD/tonne)
  • AC-3: ConversΓ£o automΓ‘tica de unidades de metal para unidade de preΓ§o
  • AC-4: Retornar valor em moeda configurΓ‘vel (default USD)
  • AC-5: FunΓ§Γ£o pura

Technical Notes:

  • ConversΓ΅es: 1 troy oz = 31.1035g, 1 lb = 453.592g
  • LocalizaΓ§Γ£o: backend/app/nsr_engine/calculations.py

Exemplo de uso:

result = compute_gross_revenue(
    payable_metal=22.241,  # tonnes Cu
    price=8500,            # USD/tonne
)
# result.value = 189,048.50 USD

Definition of Done:

  • FunΓ§Γ£o implementada
  • Testes com diferentes unidades
  • ConversΓ΅es validadas

US-06: FunΓ§Γ£o compute_deductions

Como NSR Engine, eu preciso calcular todas as deduΓ§Γ΅es para chegar ao NSR lΓ­quido.

Acceptance Criteria:

  • AC-1: TC (Treatment Charge): valor por dmt de concentrado
  • AC-2: RC (Refining Charge): valor por unidade de metal pagΓ‘vel
  • AC-3: Penalidades: lista de (name, value, unit)
  • AC-4: Retornar breakdown detalhado de cada deduΓ§Γ£o
  • AC-5: Suportar deduΓ§Γ΅es fixas e variΓ‘veis
  • AC-6: FunΓ§Γ£o pura

Technical Notes:

  • dmt = dry metric tonne
  • Penalidades podem ser: fixas, por unidade de metal, por unidade de concentrado

Estrutura de retorno:

DeductionsResult(
    tc=5000.00,
    rc=2500.00,
    penalties=[
        {"name": "Arsenic", "value": 1200.00},
        {"name": "Moisture", "value": 300.00}
    ],
    total=9000.00,
    breakdown=[...]  # detalhamento para auditoria
)

Definition of Done:

  • FunΓ§Γ£o implementada
  • Testes para cada tipo de deduΓ§Γ£o
  • Breakdown auditΓ‘vel

US-07: FunΓ§Γ£o compute_nsr_complete (Multi-Metal CaraΓ­ba)

Como usuΓ‘rio, eu quero o NSR total e por tonelada com breakdown multi-metal para tomar decisΓ΅es de cut-off e planejamento.

Acceptance Criteria:

  • AC-1: Calcular preΓ§o do concentrado por metal (Cu, Au, Ag)
  • AC-2: Calcular NSR por metal ($/t ore)
  • AC-3: Aplicar fatores de mina: nsr_mine = nsr_processing Γ— (1 - dilution) Γ— ore_recovery
  • AC-4: Calcular 3 nΓ­veis de NSR: Mineral Resources, Processing, Mine
  • AC-5: Retornar breakdown com contribuiΓ§Γ£o de cada metal
  • AC-6: Retornar perdas detalhadas (diluiΓ§Γ£o, recovery)
  • AC-7: Suportar moeda configurΓ‘vel (default USD)
  • AC-8: FunΓ§Γ£o pura que orquestra as anteriores

Technical Notes:

  • Esta Γ© a funΓ§Γ£o principal que usuΓ‘rios chamam
  • Deve retornar breakdown completo para auditoria
  • Ver NSR_REQUIREMENTS.md para fΓ³rmulas detalhadas

Estrutura de retorno:

NSRResult(
    # PreΓ§o do concentrado
    conc_price_cu=2824.68,
    conc_price_au=244.76,
    conc_price_ag=29.65,
    conc_price_total=3099.09,
    
    # NSR por metal ($/t ore)
    nsr_cu=108.21,
    nsr_au=9.38,
    nsr_ag=1.14,
    
    # NSR por nΓ­vel
    nsr_mineral_resources=175.61,  # Antes de processing
    nsr_processing=131.76,         # ApΓ³s perdas de processing
    nsr_mine=148.01,               # ApΓ³s diluiΓ§Γ£o e ore recovery
    nsr_per_tonne=118.72,          # NSR final
    
    # Perdas
    dilution_loss=27.60,
    recovery_loss=16.25,
    
    # Metadados
    currency="USD",
    ore_tonnage=20000,
    conc_ratio=0.0383,
    cu_recovery=0.9654,
    formula_applied="Ver NSR_REQUIREMENTS.md",
    inputs_used={...}
)

Golden Test Case (Vermelhos Sul):

  • Cu Grade: 1.4%, Au: 0.23 g/t, Ag: 2.33 g/t
  • NSR Total esperado: ~$118.72/t ore
  • TolerΓ’ncia: ≀0.1%

Definition of Done:

  • FunΓ§Γ΅es implementadas
  • Testes end-to-end do cΓ‘lculo completo
  • Golden test com caso Vermelhos Sul
  • ValidaΓ§Γ£o contra Excel CaraΓ­ba (diff ≀0.1%)

US-08: Golden Tests (RegressΓ£o NumΓ©rica)

Como QA, eu quero testes de regressΓ£o com valores conhecidos para garantir que cΓ‘lculos nΓ£o mudam inadvertidamente.

Acceptance Criteria:

  • AC-1: Arquivo tests/golden/ com casos de teste em JSON/YAML
  • AC-2: MΓ­nimo 5 casos cobrindo diferentes cenΓ‘rios
  • AC-3: Casos validados manualmente contra Excel
  • AC-4: Testes falham se resultado difere > 0.01%
  • AC-5: DocumentaΓ§Γ£o de como adicionar novos golden tests

Technical Notes:

  • Golden tests sΓ£o "snapshot tests" para valores numΓ©ricos
  • Devem rodar no CI em cada PR

Estrutura de caso:

# tests/golden/cases/copper_simple.yaml
name: "Copper Simple Case"
description: "Basic copper NSR calculation validated against Excel"
inputs:
  tonnage: 1000
  grade: 2.5
  grade_unit: "%"
  recovery: 0.92
  payability: 0.965
  price: 8500
  price_unit: "USD/tonne"
  tc: 80
  rc: 0.08
  penalties: []
expected:
  nsr_total: 180048.50
  nsr_per_tonne: 180.05
  tolerance: 0.0001  # 0.01%

Definition of Done:

  • Estrutura de golden tests criada
  • 5+ casos implementados
  • CI configurado para rodar golden tests

Epic 3: API Backend

US-09: Endpoint POST /compute/nsr

Como frontend, eu quero um endpoint stateless para calcular NSR para obter resultados sem persistΓͺncia.

Acceptance Criteria:

  • AC-1: Endpoint POST /api/v1/compute/nsr
  • AC-2: Request body com todos inputs necessΓ‘rios
  • AC-3: Response com NSRResult completo
  • AC-4: ValidaΓ§Γ£o de inputs com mensagens claras
  • AC-5: DocumentaΓ§Γ£o OpenAPI automΓ‘tica
  • AC-6: Tempo de resposta P95 < 500ms

Technical Notes:

  • Endpoint stateless (nΓ£o persiste nada)
  • Usa NSR Engine internamente

Request:

{
  "ore": {
    "tonnage": 1000,
    "grade": 2.5,
    "grade_unit": "percent"
  },
  "metal": {
    "name": "copper",
    "price": 8500,
    "price_unit": "USD/tonne"
  },
  "recovery": 0.92,
  "terms": {
    "payability": 0.965,
    "tc": 80,
    "rc": 0.08,
    "penalties": []
  }
}

Response:

{
  "nsr_total": 180048.50,
  "nsr_per_tonne": 180.05,
  "currency": "USD",
  "breakdown": {
    "gross_revenue": 189048.50,
    "payable_metal": 22.241,
    "deductions": {
      "tc": 5000.00,
      "rc": 2500.00,
      "penalties": 0,
      "total": 7500.00
    }
  },
  "formula": "...",
  "inputs": {...}
}

Definition of Done:

  • Endpoint implementado
  • Testes de integraΓ§Γ£o
  • OpenAPI documentado
  • Exemplos em Swagger UI

US-10: Endpoint GET /health

Como infraestrutura, eu quero um health check para monitorar disponibilidade.

Acceptance Criteria:

  • AC-1: Endpoint GET /health
  • AC-2: Retorna {"status": "healthy", "version": "x.y.z"}
  • AC-3: Tempo de resposta < 100ms
  • AC-4: NΓ£o requer autenticaΓ§Γ£o

Definition of Done:

  • Endpoint implementado
  • Teste de integraΓ§Γ£o

US-11: Tratamento de Erros Padronizado

Como desenvolvedor, eu quero erros padronizados para facilitar debugging e UX.

Acceptance Criteria:

  • AC-1: Erros de validaΓ§Γ£o retornam 422 com detalhes
  • AC-2: Erros de servidor retornam 500 com ID de correlaΓ§Γ£o
  • AC-3: Formato consistente: {"error": {"code": "...", "message": "...", "details": {...}}}
  • AC-4: Logs estruturados para todos erros
  • AC-5: Nunca expor stack traces em produΓ§Γ£o

Definition of Done:

  • Error handlers implementados
  • Testes para cada tipo de erro
  • Logs verificados

Epic 4: Frontend MVP

US-12: PΓ‘gina de Input (FormulΓ‘rio NSR)

Como Mining Engineer, eu quero um formulΓ‘rio para inserir dados para calcular NSR rapidamente.

Acceptance Criteria:

  • AC-1: Campos para: tonnage, grade, recovery, price, payability, TC, RC
  • AC-2: ValidaΓ§Γ£o client-side em tempo real
  • AC-3: Unidades selecionΓ‘veis (%, ppm, g/t)
  • AC-4: Valores default sensatos (ex: payability 96.5%)
  • AC-5: BotΓ£o "Calculate" chama API
  • AC-6: Loading state enquanto calcula
  • AC-7: Mobile responsive

Technical Notes:

  • Usar React Hook Form ou similar
  • Componentes shadcn/ui
  • Zod para validaΓ§Γ£o

Wireframe:

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚           NSR Calculator                     β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚  Ore Input                                   β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”           β”‚
β”‚  β”‚ Tonnage     β”‚  β”‚ Grade       β”‚  [unit β–Ό] β”‚
β”‚  β”‚ 1000        β”‚  β”‚ 2.5         β”‚  [%     ] β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜           β”‚
β”‚                                             β”‚
β”‚  Metal & Price                              β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”           β”‚
β”‚  β”‚ Metal       β”‚  β”‚ Price       β”‚  [unit β–Ό] β”‚
β”‚  β”‚ [Copper  β–Ό] β”‚  β”‚ 8500        β”‚  [USD/t ] β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜           β”‚
β”‚                                             β”‚
β”‚  Recovery & Terms                           β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”           β”‚
β”‚  β”‚ Recovery %  β”‚  β”‚ Payability %β”‚           β”‚
β”‚  β”‚ 92          β”‚  β”‚ 96.5        β”‚           β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜           β”‚
β”‚                                             β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”           β”‚
β”‚  β”‚ TC ($/dmt)  β”‚  β”‚ RC ($/unit) β”‚           β”‚
β”‚  β”‚ 80          β”‚  β”‚ 0.08        β”‚           β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜           β”‚
β”‚                                             β”‚
β”‚  Penalties (optional)                       β”‚
β”‚  [+ Add Penalty]                            β”‚
β”‚                                             β”‚
β”‚         [ Calculate NSR ]                   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Definition of Done:

  • FormulΓ‘rio funcional
  • ValidaΓ§Γ£o implementada
  • IntegraΓ§Γ£o com API
  • Testes de componente

US-13: PΓ‘gina de Resultado (Breakdown)

Como Mining Engineer, eu quero ver o resultado com breakdown para entender como o NSR foi calculado.

Acceptance Criteria:

  • AC-1: Exibir NSR/ton em destaque (nΓΊmero grande)
  • AC-2: Exibir NSR total
  • AC-3: Breakdown visual: receita β†’ deduΓ§Γ΅es β†’ NSR
  • AC-4: Mostrar fΓ³rmula aplicada
  • AC-5: Mostrar todos inputs usados
  • AC-6: BotΓ£o "Voltar" para editar inputs
  • AC-7: BotΓ£o "Exportar CSV"

Technical Notes:

  • Usar grΓ‘fico de barras horizontal para breakdown
  • Cores: verde (receita), vermelho (deduΓ§Γ΅es), azul (NSR)

Wireframe:

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚           NSR Result                         β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                             β”‚
β”‚    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”‚
β”‚    β”‚         NSR/tonne                 β”‚    β”‚
β”‚    β”‚         $180.05                   β”‚    β”‚
β”‚    β”‚         USD/t ore                 β”‚    β”‚
β”‚    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚
β”‚                                             β”‚
β”‚    NSR Total: $180,048.50                   β”‚
β”‚                                             β”‚
β”‚    Breakdown                                β”‚
β”‚    β”œβ”€ Gross Revenue    $189,048.50 β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ   β”‚
β”‚    β”œβ”€ TC               -$5,000.00  β–ˆβ–ˆ       β”‚
β”‚    β”œβ”€ RC               -$2,500.00  β–ˆ        β”‚
β”‚    β”œβ”€ Penalties        -$1,500.00  β–ˆ        β”‚
β”‚    └─ NSR Total        $180,048.50 β–ˆβ–ˆβ–ˆβ–ˆβ–ˆ    β”‚
β”‚                                             β”‚
β”‚    Formula Applied                          β”‚
β”‚    NSR = (T Γ— G Γ— R Γ— P Γ— Price) - TC - RC  β”‚
β”‚                                             β”‚
β”‚    Inputs Used                              β”‚
β”‚    β€’ Tonnage: 1,000 t                       β”‚
β”‚    β€’ Grade: 2.5%                            β”‚
β”‚    β€’ Recovery: 92%                          β”‚
β”‚    β€’ ...                                    β”‚
β”‚                                             β”‚
β”‚    [← Edit]              [Export CSV]       β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Definition of Done:

  • Resultado exibido corretamente
  • Breakdown visual
  • FΓ³rmula e inputs visΓ­veis
  • Testes de componente

US-14: Gerador de CenΓ‘rios AutomΓ‘tico

Como Mining Engineer, eu quero cenΓ‘rios automΓ‘ticos (base/down/up) para ver sensibilidade rapidamente.

Acceptance Criteria:

  • AC-1: Input para variaΓ§Γ£o % (default 10%)
  • AC-2: Gerar 3 cenΓ‘rios: Base, Downside (-x%), Upside (+x%)
  • AC-3: VariaΓ§Γ£o aplicada ao preΓ§o do metal
  • AC-4: Exibir tabela comparativa com os 3 cenΓ‘rios
  • AC-5: Highlight das diferenΓ§as

Technical Notes:

  • CenΓ‘rios gerados client-side (3 chamadas Γ  API) ou server-side (1 chamada)
  • Preferir server-side para performance

Wireframe:

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚    Scenario Comparison                       β”‚
β”‚    Variation: [10] %                         β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚              Downside   Base      Upside    β”‚
β”‚    Price     $7,650     $8,500    $9,350    β”‚
β”‚    NSR/ton   $162.04    $180.05   $198.05   β”‚
β”‚    NSR Total $162,045   $180,048  $198,051  β”‚
β”‚    Ξ” vs Base -10.0%     β€”         +10.0%    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Definition of Done:

  • GeraΓ§Γ£o de cenΓ‘rios funcional
  • Tabela comparativa
  • Testes

US-15: Export CSV

Como usuΓ‘rio, eu quero exportar resultados em CSV para usar em outras ferramentas.

Acceptance Criteria:

  • AC-1: BotΓ£o "Export CSV" na pΓ‘gina de resultado
  • AC-2: CSV inclui todos inputs e outputs
  • AC-3: CSV inclui timestamp e versΓ£o
  • AC-4: Nome do arquivo: nsr_result_YYYYMMDD_HHMMSS.csv
  • AC-5: Download inicia automaticamente

Formato CSV:

# NSR Calculation Export
# Generated: 2026-01-28T15:30:00Z
# Version: 1.0.0

Parameter,Value,Unit
Tonnage,1000,t
Grade,2.5,%
Recovery,92,%
Price,8500,USD/t
Payability,96.5,%
TC,80,USD/dmt
RC,0.08,USD/lb

Result,Value,Unit
Gross Revenue,189048.50,USD
Total Deductions,9000.00,USD
NSR Total,180048.50,USD
NSR per Tonne,180.05,USD/t

Definition of Done:

  • Export funcional
  • Formato CSV correto
  • Testes

Epic 5: IntegraΓ§Γ£o e Qualidade

US-16: Testes de IntegraΓ§Γ£o Backend

Como QA, eu quero testes de integraΓ§Γ£o do backend para garantir que API funciona end-to-end.

Acceptance Criteria:

  • AC-1: Testes usando TestClient do FastAPI
  • AC-2: Cobrir happy path de cada endpoint
  • AC-3: Cobrir casos de erro (validaΓ§Γ£o, 404, 500)
  • AC-4: Testes rodam no CI
  • AC-5: Coverage report gerado

Definition of Done:

  • Testes implementados
  • CI configurado
  • Coverage β‰₯ 80%

US-17: Testes de IntegraΓ§Γ£o Frontend

Como QA, eu quero testes de integraΓ§Γ£o do frontend para garantir que UI funciona corretamente.

Acceptance Criteria:

  • AC-1: Testes usando Testing Library + MSW (Mock Service Worker)
  • AC-2: Cobrir fluxo completo: input β†’ submit β†’ resultado
  • AC-3: Testar estados de loading e erro
  • AC-4: Testes rodam no CI

Definition of Done:

  • Testes implementados
  • Mocks configurados
  • CI verde

US-18: Testes E2E (Opcional MVP)

Como QA, eu quero testes E2E para validar o sistema completo.

Acceptance Criteria:

  • AC-1: Playwright ou Cypress configurado
  • AC-2: Teste do fluxo principal (input β†’ resultado β†’ export)
  • AC-3: Roda em CI (pode ser manual trigger)

Definition of Done:

  • Framework configurado
  • 1+ teste E2E funcional

Matriz de DependΓͺncias

US-01 (Setup) ──┬──► US-02 (CI/CD)
                β”‚
                └──► US-03 (DomΓ­nio) ──► US-04 (payable) ──► US-05 (revenue)
                                                β”‚                   β”‚
                                                β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                                        β”‚
                                                        β–Ό
                                              US-06 (deductions)
                                                        β”‚
                                                        β–Ό
                                              US-07 (nsr_total)
                                                        β”‚
                                                        β–Ό
                                              US-08 (golden tests)
                                                        β”‚
                                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                                    β”‚                   β”‚                   β”‚
                                    β–Ό                   β–Ό                   β–Ό
                              US-09 (API)         US-10 (health)      US-11 (errors)
                                    β”‚
                                    β–Ό
                              US-12 (form) ──► US-13 (result) ──► US-14 (scenarios)
                                                    β”‚
                                                    β–Ό
                                              US-15 (export)
                                                    β”‚
                              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                              β”‚                     β”‚                     β”‚
                              β–Ό                     β–Ό                     β–Ό
                        US-16 (int BE)        US-17 (int FE)        US-18 (E2E)

Estimativa de Complexidade

US TΓ­tulo Complexidade DependΓͺncias
US-01 Setup Repo MΓ©dia -
US-02 CI/CD MΓ©dia US-01
US-03 DomΓ­nio MΓ©dia US-01
US-04 payable_metal Baixa US-03
US-05 gross_revenue Baixa US-04
US-06 deductions MΓ©dia US-03
US-07 nsr_total Baixa US-05, US-06
US-08 Golden Tests MΓ©dia US-07
US-09 API /compute MΓ©dia US-07
US-10 /health Baixa US-01
US-11 Error Handling Baixa US-09
US-12 Form UI Alta US-09
US-13 Result UI MΓ©dia US-12
US-14 Scenarios MΓ©dia US-13
US-15 Export CSV Baixa US-13
US-16 Testes Int BE MΓ©dia US-09
US-17 Testes Int FE MΓ©dia US-15
US-18 E2E Alta US-17

Total estimado para MVP: 18 User Stories