Skip to content
This repository was archived by the owner on Jul 10, 2026. It is now read-only.

Sprint 5: /usage retorna tokens reais (TKT-042) - #113

Merged
danzeroum merged 1 commit into
mainfrom
claude/optimistic-mendel-cwuuno
Jun 21, 2026
Merged

Sprint 5: /usage retorna tokens reais (TKT-042)#113
danzeroum merged 1 commit into
mainfrom
claude/optimistic-mendel-cwuuno

Conversation

@danzeroum

Copy link
Copy Markdown
Owner

TKT-042 — usage metering real

GET /api/v1/usage retornava total_tokens_input/output = 0 (// TODO). Agora soma prompt_tokens/completion_tokens de training_interactions do workspace.

  • usa query_scalar não-macro (checado em runtime) → não depende do cache .sqlx, então compila sob SQLX_OFFLINE sem precisar de sqlx-cli/prepare
  • COALESCE(SUM(...),0)::bigint → seguro com tabela vazia

Verificação local

  • cargo build -p api (rebuild limpo) ✓ · cargo clippy -p api -- -D warnings
  • query SQL validada contra o schema do Postgres local (0|0 em workspace vazio)

🤖 Generated with Claude Code


Generated by Claude Code

O endpoint /api/v1/usage retornava total_tokens_input/output = 0 (// TODO).
Agora soma prompt_tokens/completion_tokens de training_interactions do
workspace. Usa query_scalar nao-macro (checado em runtime) para nao depender
do cache .sqlx (sem necessidade de sqlx-cli/prepare).

Verificacao local: cargo build (clean) + clippy -D warnings limpos; query SQL
validada contra o schema do Postgres local.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AcsaeS7c9zJ4vkNtxqBcnc
@danzeroum
danzeroum merged commit 14572ad into main Jun 21, 2026
1 check failed
danzeroum pushed a commit that referenced this pull request Jun 22, 2026
…rator rejeitado)

Investigacao revelou que varios apontamentos da auditoria estavam desatualizados
e que ha codigo morto confundindo o crate `api`:

- removidos 5 arquivos de rota ORFAOS no api (nao declarados em routes/mod.rs,
  zero refs): usage.rs, webhooks.rs, search.rs (duplicatas mortas das rotas reais
  que vivem no crate api-public) + chat.rs, feedback.rs (stubs que importavam
  `ai_orchestrator`, um nao-dependency — nem compilariam).

Correcoes de entendimento (roadmap):
- TKT-018/019 (linkar ai-orchestrator): REJEITADO. O crate e dead code para outra
  arquitetura (vLLM, RAG rag-searcher, tabela training_interactions, SSE proprio,
  sem basic-auth nem OLLAMA_MOCK). Linka-lo quebraria o chat atual + 11 testes.
- TKT-020 (rag-searcher): REJEITADO (RAG do orchestrator); api::rag ja faz 4
  estagios com rerank.
- TKT-041 (Swagger): JA real (ApiDoc utoipa 40+ paths + SwaggerUi em /docs).
- TKT-042 (usage tokens): o caminho VIVO (admin_service.get_usage_metrics, usado
  pelo dashboard via /api/admin/metrics) JA soma tokens de usage_events. O "0 //
  TODO" estava no api/routes/usage.rs MORTO (deletado). PR #113 editou esse
  arquivo morto — superado por esta remocao.

Verificacao local: cargo build -p api -p api-public OK apos as remocoes.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AcsaeS7c9zJ4vkNtxqBcnc
danzeroum added a commit that referenced this pull request Jun 22, 2026
…ejeitado, Swagger/usage já reais) (#116)

* docs: atualiza pendencias resolvidas nesta execucao (P-01, P-07)

- P-01 vLLM vs Ollama: RESOLVIDO — runtime Ollama externo, ADR-001 atualizado;
  vLLM = profile GPU (depende de P-06).
- P-07 Redis: RESOLVIDO (parcial) — redis no compose + throttle de login usa
  Redis; falta so confirmar recursos da VPS de producao.
- P-09: remove referencia ao SHA antigo de main.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AcsaeS7c9zJ4vkNtxqBcnc

* chore(cleanup): remove rotas mortas do api + corrige roadmap (orchestrator rejeitado)

Investigacao revelou que varios apontamentos da auditoria estavam desatualizados
e que ha codigo morto confundindo o crate `api`:

- removidos 5 arquivos de rota ORFAOS no api (nao declarados em routes/mod.rs,
  zero refs): usage.rs, webhooks.rs, search.rs (duplicatas mortas das rotas reais
  que vivem no crate api-public) + chat.rs, feedback.rs (stubs que importavam
  `ai_orchestrator`, um nao-dependency — nem compilariam).

Correcoes de entendimento (roadmap):
- TKT-018/019 (linkar ai-orchestrator): REJEITADO. O crate e dead code para outra
  arquitetura (vLLM, RAG rag-searcher, tabela training_interactions, SSE proprio,
  sem basic-auth nem OLLAMA_MOCK). Linka-lo quebraria o chat atual + 11 testes.
- TKT-020 (rag-searcher): REJEITADO (RAG do orchestrator); api::rag ja faz 4
  estagios com rerank.
- TKT-041 (Swagger): JA real (ApiDoc utoipa 40+ paths + SwaggerUi em /docs).
- TKT-042 (usage tokens): o caminho VIVO (admin_service.get_usage_metrics, usado
  pelo dashboard via /api/admin/metrics) JA soma tokens de usage_events. O "0 //
  TODO" estava no api/routes/usage.rs MORTO (deletado). PR #113 editou esse
  arquivo morto — superado por esta remocao.

Verificacao local: cargo build -p api -p api-public OK apos as remocoes.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AcsaeS7c9zJ4vkNtxqBcnc

---------

Co-authored-by: Claude <noreply@anthropic.com>
danzeroum added a commit that referenced this pull request Jun 22, 2026
…não ser verificável offline (#117)

* docs: atualiza pendencias resolvidas nesta execucao (P-01, P-07)

- P-01 vLLM vs Ollama: RESOLVIDO — runtime Ollama externo, ADR-001 atualizado;
  vLLM = profile GPU (depende de P-06).
- P-07 Redis: RESOLVIDO (parcial) — redis no compose + throttle de login usa
  Redis; falta so confirmar recursos da VPS de producao.
- P-09: remove referencia ao SHA antigo de main.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AcsaeS7c9zJ4vkNtxqBcnc

* chore(cleanup): remove rotas mortas do api + corrige roadmap (orchestrator rejeitado)

Investigacao revelou que varios apontamentos da auditoria estavam desatualizados
e que ha codigo morto confundindo o crate `api`:

- removidos 5 arquivos de rota ORFAOS no api (nao declarados em routes/mod.rs,
  zero refs): usage.rs, webhooks.rs, search.rs (duplicatas mortas das rotas reais
  que vivem no crate api-public) + chat.rs, feedback.rs (stubs que importavam
  `ai_orchestrator`, um nao-dependency — nem compilariam).

Correcoes de entendimento (roadmap):
- TKT-018/019 (linkar ai-orchestrator): REJEITADO. O crate e dead code para outra
  arquitetura (vLLM, RAG rag-searcher, tabela training_interactions, SSE proprio,
  sem basic-auth nem OLLAMA_MOCK). Linka-lo quebraria o chat atual + 11 testes.
- TKT-020 (rag-searcher): REJEITADO (RAG do orchestrator); api::rag ja faz 4
  estagios com rerank.
- TKT-041 (Swagger): JA real (ApiDoc utoipa 40+ paths + SwaggerUi em /docs).
- TKT-042 (usage tokens): o caminho VIVO (admin_service.get_usage_metrics, usado
  pelo dashboard via /api/admin/metrics) JA soma tokens de usage_events. O "0 //
  TODO" estava no api/routes/usage.rs MORTO (deletado). PR #113 editou esse
  arquivo morto — superado por esta remocao.

Verificacao local: cargo build -p api -p api-public OK apos as remocoes.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AcsaeS7c9zJ4vkNtxqBcnc

* docs(rls): plano seguro de RLS (TKT-026) + prova no DB do isolamento

Investigacao de RLS revelou um risco que impede habilitar ingenuamente:
scoped_conn usa set_config('app.workspace_id', $1, FALSE) — nivel de SESSAO
numa conexao do POOL. O valor persiste apos a conexao voltar ao pool; com RLS
usando current_setting, uma query nao-scoped numa conexao reusada herdaria o
workspace anterior -> vazamento/quebra cruzada. Nao da p/ verificar isso sem
rodar o app sob concorrencia.

Entrega (por integridade, plano + prova de DB em vez de migration arriscada):
- docs/rls-plan.md: caminho seguro — (1) GUC transaction-local (SET LOCAL em
  transacao) em TODO caminho tenant; (2) migration estrita por tabela; (3)
  cleanup defensivo. Politica usa NULLIF(current_setting(...),'') p/ evitar erro
  de cast de string vazia apos RESET.
- Prova no Postgres local (role nao-superuser): SET app.workspace_id=A ve so A,
  =B ve so B, unset/RESET -> 0 linhas sem erro. Valida a politica e o isolamento.

Roadmap atualizado: TKT-026 = planejado + provado no DB, NAO habilitado no app.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AcsaeS7c9zJ4vkNtxqBcnc

---------

Co-authored-by: Claude <noreply@anthropic.com>
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants