Documenta explicitamente o padrão já em uso em okf/entidades/ e
okf/relacionamentos/*.md (Tier 1 curado + Tier 3 narrativo). Declara
Nível de Maturidade N1 com justificação — sem inventory/ automático
nem relations.jsonl, apesar do volume de código (75 ficheiros .ts/.tsx)
exceder o limiar literal de N2, por falta de infraestrutura de geração.
Decisão de não migrar relacionamentos/*.md para relations.jsonl
(SPEC-OKF-Projeto-Sistema-Excelencia.md §3.6/§5.4) — custo de
automação não compensa a escala actual (21 arestas).
Fase 4 do PLAN-OKF-Projeto-Sistema-Excelencia.md (Hub).
- routes/sessions.ts: createSessionsAnalysisRouter com GET /patterns (filtros
week/severity/key/days, paginado, Zod) e GET /stats (agregados: sessões
totais e por dia, by_source, by_outcome, tool_top, skill_top,
patterns_by_type, gate_blocks, avg_duration_sec, last_indexed_at,
latest_pattern_week); montado em /api/sessions (C4) e /api (alias F4.1)
- services/sessions/db.ts: listPatterns/countPatterns/getStats +
rowToPattern/buildPatternsWhere; gate_blocks devolve null enquanto a
tabela gate_events não existir (F1 arco C3-gates)
- tests/sessions-analysis-route.test.ts: 15 testes (filtros, paginação,
validação, gate_blocks condicional, não-colisão com /:id)
- inclui camada session_events pendente de v2.7.3 (db.ts/indexer.ts —
storeSessionEvents no indexAll; rota /:id lê da BD) já em execução, para
a árvore commitada compilar coerente
Validado contra BD real (11459 sessões, 160 padrões): curl 200 com JSON
não-vazio em /api/patterns, /api/stats, /api/sessions/patterns?week=2026-W26,
/api/sessions/stats?days=7.
- checkAllSites(): verificação activa dos 8 sites do ping (status + piso de
tamanho + assinaturas de erro Redis/BD + marcador positivo) -> category=site_uptime.
Apanha "HTTP 200 mas página partida" independente do wp-cron/plugin.
- checkStaleness(): corrige categoria 'wordpress'->'site' (bug: nunca corria
contra os dados reais do plugin) + limiar 24h->26h.
- Ligado ao collector que corre a cada 5 min no scheduler.
Security Audit (Regra #47):
- npm audit executado: 18 vulnerabilidades pré-existentes em deps transitivas
(esbuild/vite/tsx/react-router/vitest/express/shell-quote, etc.)
- NENHUMA introduzida por este commit (altera 1 ficheiro, zero deps novas)
- Override justificado: dev/transitivas, fix exige npm audit fix global (fora
do âmbito deste fix). A documentar como dívida técnica separada.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- server-metrics: substituir CWP (só aceita ed25519) por Easy server
(aceita password auth na porta 22)
- monitoring-collector: remover chamadas a monitor.getSystemStats e
monitor.getDockerTaskStats (endpoint não existe nesta versão EasyPanel);
métricas CPU/RAM via SSH e containers via docker service ls sobre SSH
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adiciona offline_access ao scope e automaticSilentRenew para renovar
tokens silenciosamente sem forçar re-login. Requer Access Token validity
aumentado no provider Authentik (de 5min para 8h).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Sessões com outcome=interrupted e ≥10 eventos são redirects naturais
do utilizador, não falhas da skill. O detector contava todas as
interrupções como falhas, gerando falsos positivos para skills
conversacionais como superpowers:brainstorming.
Fix: só contar como falha erros reais (outcome=error) ou interrupções
precoces (<10 eventos).
Resolve ticket #10407.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Quando um padrão atinge ≥3 semanas consecutivas com severity warning/action,
além de abrir ticket no Desk, propõe também como staging entry no
/media/ealmeida/Dados/.carl/carl.json para revisão e eventual promoção a
regra. Idempotente por pattern_key. Dry-run log-only.
Fecha o feedback loop Observabilidade → CARL identificado na análise do
sistema: padrões detectados empiricamente viram propostas de regras.
- #7 actions_never_executed: acções P1/P2 em disc #33 há ≥14 dias pendentes
- #8 skill_narrative_vs_data: skill reportada problemática em worklogs
mas com outcome=completed nas sessões (≥3 matches)
- #9 worklog_pattern_frequency: tokens recorrentes (≥3 worklogs) em patterns_text
- Integrados em detectPatterns() como secção opcional quando worklogs > 0
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Itera semanas ISO desde a primeira sessão até (excluindo) a semana corrente,
detectando padrões e fazendo upsert com consecutive_weeks acumulado. Nunca
publica comentários nem abre tickets — apenas povoa a tabela patterns com
histórico. Output JSON por semana e sumário final.
Permite popular retroactivamente a tabela patterns após nova instalação ou
reset, dando base imediata ao detector de padrões persistentes.
Substitui chamadas HTTP directas à API Desk (/api/v1/discussions, /api/v1/tickets)
por JSON-RPC 2.0 ao gateway MCP (desk-crm). Helper callMcpTool lida com respostas
JSON ou SSE. Substitui DESK_API_TOKEN/DESK_BASE_URL por MCP_GATEWAY_TOKEN/URL.
- add_discussion_comment: discussion_id=32, staff_id=25 (Observabilidade)
- create_ticket: subject/message/priority(1-4)/department=1
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Antes: skills_invoked vazio em 1608/1608 sessões porque detectSkillInvoked
apenas era aplicado ao text extraído de content[type=text]. A string
'Launching skill: X' vive dentro de tool_result.content (string ou array
de text blocks), que era ignorada.
Fix: adicionar helper extractResultText(r) que trata ambos os casos e
aplicar detectSkillInvoked + detectHook também ao tool_result. Após
re-indexação full, 526/1616 sessões têm agora skills detectadas e o
detector de padrões devolve 6 padrões (vs 2 baseline), incluindo
skills_with_high_error_rate reais.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Script CLI api/scripts/sessions-patterns.ts com args --week, --publish, --force.
Default: semana actual, dry-run (render HTML stderr + JSON summary stdout).
Com --publish:
- POST html comentário para /api/v1/discussions/32/comments (Desk)
- Para padrões com consecutive_weeks>=3 e severity warning|action: auto-abre
TICKET via /api/v1/tickets (priority 3|4 conforme severity)
Pipeline interno: detectPatterns -> upsertPattern placeholder -> computar
consecutive_weeks -> upsert final. Escape HTML defensivo; 5 sample ids por padrão.
Auth via DESK_API_TOKEN (env file), NUNCA hardcoded.
Refs Fase 6A
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Cria unit file para correr sessions-indexer em --watch permanente.
Inclui KillMode=mixed + TimeoutStopSec=10s + Restart=on-failure
para graceful shutdown do watcher+DB.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Task 5 do MVP Espelho: endpoint Express com factory createSessionsRouter(db)
que expõe GET / (lista filtrável por days/project/tool/skill/q + limit/offset
validados via Zod) e GET /:id (meta + eventos via parseSessionFile). Integrado
em server.ts com DB aberta a partir de OBSERVABILIDADE_DB ?? DEFAULT_DB_PATH.
Validação empírica: total=559 sessões (últimos 7d), detalhe com 37 eventos.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Remover import Zap não utilizado em App.tsx e adicionar import LayoutDashboard
em falta no Financial.tsx.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Expansão do dashboard de 3 para 8 páginas com dados reais do stack:
- MCPs: monitorização de 33 MCPs no gateway com ping e estado online/offline
- n8n: 14 workflows com último run, duração e falhas 24h
- Paperclip: 16 agentes operacionais, routines e issues (PostgreSQL)
- IA/Claude: visão das 3 camadas (189 skills, 72 agents, 39 MCPs, CARL)
- Operações: tickets Desk CRM por departamento + cobertura PROCs
16 ficheiros novos (3042 linhas), 3 existentes editados.
Nova dependência: pg (PostgreSQL client para Paperclip).
Audit: 0 vulnerabilidades (npm audit fix aplicado).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Substitui navegacao por header/menu mobile por sidebar lateral colapsavel
com toggle, persistencia localStorage e responsividade automatica.
- Novo componente Layout.tsx com sidebar, tooltips e overlay mobile
- Estado colapsado persistido em localStorage (desktop)
- Colapsada por defeito em mobile com drawer animado
- Animacoes suaves via framer-motion (spring)
- Removida navegacao duplicada de App.tsx, Monitor.tsx e Financial.tsx
- Rotas envolvidas pelo Layout via React Router Outlet
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>