Skip to content

Pipeline de dados

| Camada | Onde | Conteúdo | |---|---|---| | Bronze | kanban-ekyte-experiment/data/raw/*.json | Páginas brutas Ekyte API (workspaces, squads, projects, users, tasks status 10/20/30/40, time_trackings) | | Silver | kanban-ekyte-experiment/data/events.db (SQLite) | Event store: CardCreated, CardCompleted, CardCancelled, CardMoved (inferido), HoursLogged | | Gold | kanban-ekyte-experiment/data/marts.duckdb (DuckDB) | Marts: mart_cards, mart_hours_vs_flow, mart_aging_wip, mart_throughput_weekly, etc. |

Script /tmp/squad_v2_pipeline.py:

  1. mart_cards via DuckDB CLI (metadata por card)
  2. data/raw/time_trackings_p*.json direto (preserva phaseId por entry — não está no events.db)
  3. Computa por card: first_any_hour, first_work_phase_hour, entered_work_first, entered_aprov_first, h_by_logger, h_by_phase_cat
  4. Junta com entered_current_phase_at do mart (necessário para cards status=active em Aprovação cliente)
  5. Aplica fórmulas v2 (ver Modelo de tempo)
  6. Emite src/data/{squad}.json (cards detalhados) e src/data/{squad}_summary.json (stats agregadas)

Mart mart_cards.total_minutes_logged agrega tudo sob executor_name do card (= assignee, frequentemente o gerente). Para “quem realmente trabalhou”, agregamos HoursLogged.payload.executor_name (= logger).

Exemplo descoberto em ABM: Ana Julia (gerente) aparecia como dona de 135.8h via mart. Pelo HoursLogged real: Diego Artur 143.7h (94%), Ana 8.8h (6%). Gerente é assignee burocrática; dev executa.

Por isso o quadro “horas por pessoa” sempre usa o logger, nunca o assignee.

| Sinal | Trilha | Confiança | Cobertura | |---|---|---|---| | effort_h, estimated_h | A (TT direto) | alta | ABM 90%, MWM 100%, Mercosul 94% | | lead_time (delivered − created) | A | alta | 100% | | wip_age, current_phase | A | alta | 100% | | CardMoved (transições) | B (inferido) | baixa | ABM 47%, MWM 23%, Mercosul 47% |

Não usar transições intra-board como argumento de fluxo sem qualificar como inferência fraca. Para o modelo v2, usamos phaseId de HoursLogged direto do raw — mais confiável que CardMoved.

Terminal window
# Refresh raw
cd ~/.obsidian/99-development/kanban-ekyte-experiment
uv run python scripts/pull.py # ou equivalente
# Rebuild marts
uv run python scripts/ingest.py
uv run python scripts/build_marts.py
# Rebuild Starlight data
python3 /tmp/squad_v2_pipeline.py
python3 /tmp/build_squad_stats.py
# Dev server
cd ~/.obsidian/99-development/kanban-docs
pnpm dev