diff --git a/core/disciplines.json b/core/disciplines.json index 976329e..5bbe8ce 100644 --- a/core/disciplines.json +++ b/core/disciplines.json @@ -160,6 +160,32 @@ "print(", "for " ] + }, + { + "id": "calendario", + "label": "Calendário acadêmico", + "command": "/calendario", + "menuShort": "/calendario", + "siloClass": "calendario", + "menuDescription": "Datas de TP, AT, Projeto de Bloco, feriados e recessos (calendário oficial)", + "queryMarkers": [ + "calendário", + "calendario", + "cronograma", + "prazo", + "data de entrega", + "quando é a entrega", + "quando e a entrega", + "quando entrega", + "quando é o at", + "quando e o at", + "quando é o tp", + "quando e o tp", + "reentrega", + "feriado", + "recesso", + "trimestre" + ] } ] } diff --git a/core/systemPrompt/system_prompt.txt b/core/systemPrompt/system_prompt.txt index 9ee4b1a..71c62aa 100644 --- a/core/systemPrompt/system_prompt.txt +++ b/core/systemPrompt/system_prompt.txt @@ -39,6 +39,8 @@ Ordem de prioridade (maior → menor): - Metadados de catálogo (título, slug, resumo) **orientam escopo** — **não** são prova factual. - O contrato de **grounding** injectado neste turno define se os trechos são SSOT absoluto ou evidência primária (com extensão pedagógica rotulada quando permitida). - Quando um excerto for ambíguo ou parcial, indique o que falta em vez de inferir. +- Trechos de **transcrição** (título «Transcrição da aula N…») trazem marcadores `[mm:ss]` = minuto da gravação. Ao citar o que o professor disse, indique aula e minuto (ex.: «aula 11, por volta de [23:10]») para o aluno conferir na gravação. +- Trechos de **calendário** (`calendario`) listam entregas de TP/AT/PB por **semana**; responda com a semana (datas de início e fim) e lembre que o dia e a hora exatos são definidos pelo professor no portal. ## 5. Segurança e limites diff --git a/docs/wiki/10-integracao-iss-fase5b.md b/docs/wiki/10-integracao-iss-fase5b.md index 66448e8..57a1fb0 100644 --- a/docs/wiki/10-integracao-iss-fase5b.md +++ b/docs/wiki/10-integracao-iss-fase5b.md @@ -56,6 +56,17 @@ Objetivos: {csv separado por ;} - Falha CI se drift crítico - `POST /reload` após ingest bem-sucedido +## Rows extra: transcrições e calendário + +Além das lições, o ingest do ISS (`knowledge_extras.py`) grava na mesma tabela: + +| Tipo | `discipline` | `slug` | Conteúdo | +|------|--------------|--------|----------| +| Transcrição bruta | a da aula | `transcricao__NN__DDMMYYYY` | Texto integral do `.vtt` com `[mm:ss]` a cada ~60 s; sem nomes de quem fala | +| Calendário | `calendario` | `calendario-YYYY-trim-N` | Resumo de entregas TP/AT/PB + grelha semanal (planilha pública Infnet) | + +No KernelBot nada muda estruturalmente: são rows normais, chunkadas a 500 palavras. O `__NN__` do slug vira «Aula NN» na UI; o título vem da 1.ª linha do chunk quando a row não está no catálogo. Essas chaves aparecem como `index_only` no `/health/catalog` — o `verify-kernelbot-sync.mjs` exclui-as da contagem de lições e só falha por `catalog_only`. + ## O que o KernelBot **não** faz na ingest | Não faz | Quem faz | diff --git a/docs/wiki/19-faq-usuario.md b/docs/wiki/19-faq-usuario.md index bdd0dce..8aa92a2 100644 --- a/docs/wiki/19-faq-usuario.md +++ b/docs/wiki/19-faq-usuario.md @@ -120,12 +120,13 @@ Se **não** houver fonte e o tema estiver fora do material, o Kernel deve dizer ## Dúvidas sobre a faculdade (prazos, professores, Living Code) -Hoje o bot responde melhor sobre **conteúdo de aula**. Informação administrativa (datas oficiais, regulamento completo, corpo docente) depende de estar **indexada** no corpus. +**Datas de TP, AT e Projeto de Bloco**: o calendário acadêmico oficial está indexado por trimestre (`/calendario` ou pergunte «quando é a entrega do TP2?»). O bot responde com a **semana** (ex.: 09 a 14/11); o dia e a hora exatos de cada entrega são definidos pelo professor no portal — confirme lá. -Se a resposta for vaga ou disser que não encontrou na base: +**«O que o professor disse sobre X?»**: além das lições resumidas, as **transcrições das aulas** estão indexadas com marcadores de minuto `[mm:ss]`. Quando a resposta citar «aula 11, por volta de [23:10]», é o ponto da gravação para conferir. + +Regulamento completo, corpo docente e outras informações administrativas ainda **não** estão no corpus. Se a resposta for vaga ou disser que não encontrou na base: - Consulte o **portal / AVA** e a **coordenação** -- Em breve: documentos institucionais dedicados no índice --- diff --git a/engine/context.py b/engine/context.py index 8945bdd..d13b9ad 100644 --- a/engine/context.py +++ b/engine/context.py @@ -539,11 +539,14 @@ def _build_source_details_for_ui( slug = parts[0] entry = lesson_catalog.entry_for_source(src) if lesson_catalog else None - lesson_title = ( - (entry.title or entry.name).strip() - if entry - else _display_name_from_source(src) - ) + if entry: + lesson_title = (entry.title or entry.name).strip() + else: + # Rows fora do catálogo (transcrições, calendário): o chunk começa pelo título + # (`{title}\n…` ou `Título: {title}\n…` em engine.database._chunk_text). + first_line = (chunk.get("text") or "").split("\n", 1)[0].strip() + first_line = first_line.removeprefix("Título:").strip() + lesson_title = first_line or _display_name_from_source(src) chunk_excerpt = _excerpt_for_ui(chunk.get("text") or "") catalog_excerpt = (entry.excerpt or "").strip() if entry else "" excerpt = chunk_excerpt or _excerpt_for_ui(catalog_excerpt, max_len=220)