sagadeck 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (233) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +305 -0
  3. package/SKILL.md +148 -0
  4. package/bin/sagadeck.js +511 -0
  5. package/docs/ANDAMENTO.md +1255 -0
  6. package/docs/EXPERIENCIAS.md +39 -0
  7. package/docs/PLANO-EXPERIENCIAS.md +39 -0
  8. package/docs/PLANO-TESTE-AULAS-TECNICAS.md +44 -0
  9. package/docs/PLANO-TESTE-DESINFORMACAO.md +38 -0
  10. package/docs/REFERENCIA.md +1131 -0
  11. package/package.json +59 -0
  12. package/src/adaptive-layouts.js +18 -0
  13. package/src/ai/art-direction.js +8 -0
  14. package/src/ai/commands.js +130 -0
  15. package/src/ai/context.js +245 -0
  16. package/src/ai/deck-ai.js +1135 -0
  17. package/src/ai/directions.js +74 -0
  18. package/src/ai/document-materials.js +49 -0
  19. package/src/ai/document-visuals.js +215 -0
  20. package/src/ai/evaluation.js +31 -0
  21. package/src/ai/ground.js +55 -0
  22. package/src/ai/llm.js +292 -0
  23. package/src/ai/quality.js +51 -0
  24. package/src/ai/relay.js +45 -0
  25. package/src/ai/staged-generation.js +24 -0
  26. package/src/ai/transform.js +858 -0
  27. package/src/ai/usage.js +17 -0
  28. package/src/ai/variety.js +80 -0
  29. package/src/ai/video-frames.js +24 -0
  30. package/src/ai/video-generation.js +126 -0
  31. package/src/ai/web-operation.js +31 -0
  32. package/src/algo-catalog.js +153 -0
  33. package/src/algo-trace.js +139 -0
  34. package/src/api-client.js +514 -0
  35. package/src/api-collections.js +14 -0
  36. package/src/api-demo.js +222 -0
  37. package/src/aspect.js +40 -0
  38. package/src/build.js +323 -0
  39. package/src/carousel.js +56 -0
  40. package/src/chrome.js +65 -0
  41. package/src/code-highlight.js +68 -0
  42. package/src/code-lab-browser.js +22 -0
  43. package/src/code-lab.js +3 -0
  44. package/src/code-language.js +52 -0
  45. package/src/csv.js +74 -0
  46. package/src/decision-lab.js +20 -0
  47. package/src/deck-file.js +119 -0
  48. package/src/diagram/napkin-examples.js +13 -0
  49. package/src/diagram/napkin.js +539 -0
  50. package/src/docx.js +128 -0
  51. package/src/dynamics/git-sim.js +200 -0
  52. package/src/dynamics/layouts.js +112 -0
  53. package/src/elements.js +554 -0
  54. package/src/experiences.js +124 -0
  55. package/src/exploration.js +31 -0
  56. package/src/export/browser.js +53 -0
  57. package/src/export/estudo.js +67 -0
  58. package/src/export/pptx.js +475 -0
  59. package/src/export/roteiro.js +40 -0
  60. package/src/export/shots.js +182 -0
  61. package/src/figures/charts.js +383 -0
  62. package/src/figures/diagrams.js +117 -0
  63. package/src/figures/icons.js +166 -0
  64. package/src/figures/material-pictos.js +20 -0
  65. package/src/figures/pictos.js +255 -0
  66. package/src/figures/points.js +106 -0
  67. package/src/figures/qr.js +29 -0
  68. package/src/figures/ufmap.js +48 -0
  69. package/src/fiscal/autofix.js +377 -0
  70. package/src/fiscal/normalize.js +115 -0
  71. package/src/graph-lab.js +24 -0
  72. package/src/hologram.js +30 -0
  73. package/src/identity.js +86 -0
  74. package/src/import/crop.js +59 -0
  75. package/src/import/index.js +132 -0
  76. package/src/import/legacy-word.js +42 -0
  77. package/src/import/merge.js +45 -0
  78. package/src/import/office.js +123 -0
  79. package/src/import/omml.js +69 -0
  80. package/src/import/pdf-render.js +56 -0
  81. package/src/import/pptx.js +701 -0
  82. package/src/import/xml.js +42 -0
  83. package/src/infographic.js +401 -0
  84. package/src/layouts.js +723 -0
  85. package/src/lessons.js +171 -0
  86. package/src/library.js +399 -0
  87. package/src/markup.js +116 -0
  88. package/src/master.js +214 -0
  89. package/src/mcp/server.js +371 -0
  90. package/src/meeting.js +42 -0
  91. package/src/motion.js +56 -0
  92. package/src/package.js +116 -0
  93. package/src/playground.js +19 -0
  94. package/src/portal-scene.js +20 -0
  95. package/src/preferences.js +61 -0
  96. package/src/protect.js +51 -0
  97. package/src/purpose.js +24 -0
  98. package/src/pytrace.js +1092 -0
  99. package/src/research/duckduckgo.js +73 -0
  100. package/src/research/research.js +202 -0
  101. package/src/research/svg-image.js +17 -0
  102. package/src/research/visuals.js +52 -0
  103. package/src/runtime/api-collection-ui.js +5 -0
  104. package/src/runtime/api-collections.js +28 -0
  105. package/src/runtime/api-core.js +530 -0
  106. package/src/runtime/api-ui.js +966 -0
  107. package/src/runtime/base.css +1774 -0
  108. package/src/runtime/calc.js +139 -0
  109. package/src/runtime/code-lab.js +371 -0
  110. package/src/runtime/decision-lab.js +49 -0
  111. package/src/runtime/diagram.js +341 -0
  112. package/src/runtime/fit.js +268 -0
  113. package/src/runtime/fonts/caveat.css +2 -0
  114. package/src/runtime/fonts/comic-neue.css +3 -0
  115. package/src/runtime/fonts/fredoka.css +2 -0
  116. package/src/runtime/fonts/index.json +10 -0
  117. package/src/runtime/fonts/inter.css +2 -0
  118. package/src/runtime/fonts/patrick-hand.css +2 -0
  119. package/src/runtime/fonts/plus-jakarta-sans.css +2 -0
  120. package/src/runtime/fonts/press-start-2p.css +2 -0
  121. package/src/runtime/fonts/vt323.css +2 -0
  122. package/src/runtime/formula.js +148 -0
  123. package/src/runtime/graph-lab.js +72 -0
  124. package/src/runtime/meeting.css +7 -0
  125. package/src/runtime/meeting.js +10 -0
  126. package/src/runtime/motion.js +15 -0
  127. package/src/runtime/playground.js +11 -0
  128. package/src/runtime/points.js +19 -0
  129. package/src/runtime/portal-scene.css +6 -0
  130. package/src/runtime/portal-scene.js +22 -0
  131. package/src/runtime/runtime.js +827 -0
  132. package/src/runtime/science.js +89 -0
  133. package/src/runtime/skins/aluminio.css +31 -0
  134. package/src/runtime/skins/arcade.css +25 -0
  135. package/src/runtime/skins/aurora.css +17 -0
  136. package/src/runtime/skins/bauhaus.css +19 -0
  137. package/src/runtime/skins/editorial.css +19 -0
  138. package/src/runtime/skins/jornal.css +17 -0
  139. package/src/runtime/skins/manual-noite.css +14 -0
  140. package/src/runtime/skins/manual.css +14 -0
  141. package/src/runtime/skins/noite.css +21 -0
  142. package/src/runtime/skins/oceano.css +17 -0
  143. package/src/runtime/skins/pop.css +23 -0
  144. package/src/runtime/skins/prata.css +18 -0
  145. package/src/runtime/skins/prisma.css +28 -0
  146. package/src/runtime/skins/rabisco.css +18 -0
  147. package/src/runtime/skins/relevo.css +33 -0
  148. package/src/runtime/skins/sinal.css +16 -0
  149. package/src/runtime/skins/terminal.css +23 -0
  150. package/src/runtime/vendor/KATEX-LICENSE.txt +21 -0
  151. package/src/runtime/vendor/MERMAID-LICENSE.txt +21 -0
  152. package/src/runtime/vendor/PLOTLY-LICENSE.txt +21 -0
  153. package/src/runtime/vendor/katex.css +1 -0
  154. package/src/runtime/vendor/mermaid.min.js +3636 -0
  155. package/src/runtime/vendor/plotly.min.js +3620 -0
  156. package/src/runtime/video-player.js +35 -0
  157. package/src/science.js +162 -0
  158. package/src/studio/ai-response.js +36 -0
  159. package/src/studio/api-routes.js +152 -0
  160. package/src/studio/assets/contexto/leia-me.md +12 -0
  161. package/src/studio/assets/contexto/vendas.csv +7 -0
  162. package/src/studio/assets/imagens/colecao-arquitetura.png +0 -0
  163. package/src/studio/assets/imagens/colecao-cor.png +0 -0
  164. package/src/studio/assets/imagens/colecao-equipe.png +0 -0
  165. package/src/studio/assets/imagens/lavanda-cover.jpg +0 -0
  166. package/src/studio/code-routes.js +32 -0
  167. package/src/studio/command-approval.js +48 -0
  168. package/src/studio/demo-decks.js +98 -0
  169. package/src/studio/direction-routes.js +29 -0
  170. package/src/studio/errors.js +65 -0
  171. package/src/studio/exploration-demo.js +17 -0
  172. package/src/studio/exporting.js +105 -0
  173. package/src/studio/generation-report.js +10 -0
  174. package/src/studio/instance.js +48 -0
  175. package/src/studio/layout-samples.js +152 -0
  176. package/src/studio/project.js +371 -0
  177. package/src/studio/public/api-collections.js +28 -0
  178. package/src/studio/public/app.js +5265 -0
  179. package/src/studio/public/art-preview.js +10 -0
  180. package/src/studio/public/calc-fields.js +11 -0
  181. package/src/studio/public/chat-progress.js +47 -0
  182. package/src/studio/public/developer-fields.js +22 -0
  183. package/src/studio/public/explorer.js +443 -0
  184. package/src/studio/public/history.js +58 -0
  185. package/src/studio/public/index.html +867 -0
  186. package/src/studio/public/inspector.js +270 -0
  187. package/src/studio/public/lab-fields.js +5 -0
  188. package/src/studio/public/library.css +275 -0
  189. package/src/studio/public/library.html +55 -0
  190. package/src/studio/public/library.js +471 -0
  191. package/src/studio/public/merge-decks.js +155 -0
  192. package/src/studio/public/review-ui.js +100 -0
  193. package/src/studio/public/screenshot-editor.js +140 -0
  194. package/src/studio/public/share-ui.js +72 -0
  195. package/src/studio/public/slide-clipboard.js +23 -0
  196. package/src/studio/public/slide-form.js +1263 -0
  197. package/src/studio/public/studio-awareness.js +154 -0
  198. package/src/studio/public/studio-next.css +303 -0
  199. package/src/studio/public/style.css +1262 -0
  200. package/src/studio/public/ui-icons.js +2 -0
  201. package/src/studio/public/viewers.js +372 -0
  202. package/src/studio/public/visual-editor.js +326 -0
  203. package/src/studio/public/workspace.js +18 -0
  204. package/src/studio/public-files.js +1 -0
  205. package/src/studio/request-helpers.js +41 -0
  206. package/src/studio/server.js +1583 -0
  207. package/src/studio/share-routes.js +146 -0
  208. package/src/studio/slide-copy-routes.js +26 -0
  209. package/src/studio/slide-copy.js +30 -0
  210. package/src/studio/snapshot.js +160 -0
  211. package/src/studio/style-routes.js +103 -0
  212. package/src/studio/template-collections.js +97 -0
  213. package/src/studio/versions.js +95 -0
  214. package/src/studio/video-download.js +29 -0
  215. package/src/studio/visual-keys.js +52 -0
  216. package/src/studio/workspaces.js +39 -0
  217. package/src/table.js +93 -0
  218. package/src/templates/scaffold.js +372 -0
  219. package/src/themes.js +604 -0
  220. package/src/trace-view.js +450 -0
  221. package/src/uid.js +19 -0
  222. package/src/video-player.js +40 -0
  223. package/src/visual-edits.js +99 -0
  224. package/src/ws.js +134 -0
  225. package/templates/cenario/Texto no cen/303/241rio.yaml" +171 -0
  226. package/templates/cenario/imagens/cidade.svg +30 -0
  227. package/templates/cenario/imagens/pessoa.svg +15 -0
  228. package/templates/cenario-e-ciencia.yaml +47 -0
  229. package/templates/ensaio-api.yaml +160 -0
  230. package/templates/exemplo-alegre.yaml +75 -0
  231. package/templates/exemplo-keynote.yaml +90 -0
  232. package/templates/exemplo-napkin.yaml +139 -0
  233. package/templates/exemplo.yaml +228 -0
@@ -0,0 +1,1255 @@
1
+ # Trabalho em andamento
2
+
3
+ Diário de bordo das frentes longas: o que já entrou, o que falta e as decisões tomadas. Serve para qualquer
4
+ sessão (Claude, GPT, pessoa) continuar de onde a outra parou, sem depender de conversa ou de máquina.
5
+
6
+ **Regra:** ao terminar uma etapa, atualize este arquivo no mesmo commit. Ao abrir uma sessão nova, leia antes de
7
+ começar. Trabalho em curso vai para o GitHub (commit + push) a cada etapa, nunca só no disco local.
8
+
9
+ ---
10
+
11
+ ## Avaliação fora da hidrologia — 03/10/2026
12
+
13
+ - Plano: `docs/PLANO-TESTE-DESINFORMACAO.md`.
14
+ - Tema novo: Como uma mentira vira verdade na internet? Duas versões, executiva e estudante, geradas pela API do Studio na biblioteca oficial.
15
+ - Em curso: geração real com imagens e conferência visual. Casos fictícios e referência conceitual da UNESCO; sem reescrita externa de slides.
16
+ - Verificação planejada: conteúdo e sequência, controles e estados extremos, estudo, erros de navegador e composição. Falhas serão registradas antes de corrigir o produto.
17
+ - Executiva gerada e corrigida pelo próprio chat: gráfico com zoom/hover, escalas completa e recortada, caminhos com retorno. Conferência visual aprovada; navegação e cálculo testados no navegador e estudo offline.
18
+ - Falhas reproduzidas e corrigidas no produto: resultado válido perdido em queda do provedor durante reparo; revisão sem avanço por slide e sem relatório persistido; painel de calculadora cortado com duas curvas/comparação.
19
+ - Estudantil independente guardada como diagnóstico por mudar exemplos/ordem e manter duas pendências. Versões finais com 11 slides: editorial e Bauhaus; conteúdo, dados, fórmulas e navegação iguais, conferência visual aprovada e zero erros JavaScript nos dois HTMLs.
20
+ - Contagem anti-sono também corrigida: texto de `consulta`, que só vai para estudo, não conta como texto do palco. Relatórios pessoais e apresentações permanecem na biblioteca; código e plano vão para GitHub após validação final.
21
+
22
+ ## Exportação PPTX/PDF — 03/10/2026
23
+
24
+ - Diagnóstico com decks sintéticos de dois slides; a aula de 80 slides não foi usada nesta rodada.
25
+ - LaTeX no PowerPoint preservado como imagem em resolução dupla: fórmula isolada ou parágrafo inteiro com fórmulas, mantendo também o texto entre elas. Evita reconstrução incorreta de frações, expoentes e fontes KaTeX.
26
+ - Exportação aguarda gráficos, diagramas, fontes e decodificação de imagens, com limite de 15 s na preparação. PDF também espera as imagens das páginas antes de imprimir. Navegadores são fechados em finally, inclusive em erro.
27
+ - PPTX emite estado inicial oculto para entradas por clique. Widgets escapam fechamento de script. Falha de salvar retorna 500; arquivos temporários têm identificador único e são limpos.
28
+ - PDF preserva o tema por padrão; a preferência explícita de impressão clara continua disponível.
29
+ - Verificação pontual: downloads HTTP PPTX/PDF válidos, PDF aberto por parser com duas páginas e imagens em ambas; PowerPoint instalado abriu e renderizou frações, integrais, derivadas e fórmulas inline. Entradas e saídas abriram com três efeitos. Downloads pelo menu do Studio também passaram.
30
+ - Validação final: npm test, 700 testes (680 passaram, 20 pulados, zero falhas); regressão adicional de preferências passou. Bundle Python atualizado. A preferência local PDF claro foi desativada pela API do Studio para manter o visual do HTML.
31
+ - Otimizações de singleton, cache e refatorações amplas ficaram fora desta correção, para manter diagnóstico e mudança pontuais.
32
+
33
+ ## Recriação visual fiel — 02/10/2026
34
+
35
+ - Em curso: testar a aula PPTX de 83 slides pelo próprio SagaDeck, sem retoques manuais no deck. Importada uma cópia na biblioteca, tópico Laboratório de recriação.
36
+ - Regressões encontradas: prompt de recriação proibia image_prompt enquanto outras regras exigiam imagens; escritor recebia apenas itens do plano, perdendo o pedido visual completo. Teste reproduziu a proibição.
37
+ - Plano: corrigir instruções gerais; gerar a aula pelo chat; conferir conteúdo e figuras contra originais; corrigir falhas reproduzíveis no produto; repetir avaliações reais de capacidade/algoritmo/consulta; suíte, bundle, publicação e reinício na 3517.
38
+ - Referências visuais: acabamento de maquete/corte 3D para conceitos; mapas específicos precisam manter evidência, sem inventar geografia.
39
+ - Implementado: referências anexadas chegam à visão no planejamento, pedido completo chega à escrita; geração revisa automaticamente quando há ferramenta de revisão e admite três correções; resultado revelado tem estado explícito; curvas têm contraste e traços distinguíveis.
40
+ - Revisão: JSON com texto ao redor é aceito; indisponibilidade registra motivo, e achados contraditórios passam por confirmação semântica. Não se declara conferido quando uma revisão falha.
41
+ - Testes específicos desta frente: 57 passaram. A suíte anterior encontrou uma asserção desatualizada que examinava a revisão como se fosse o pedido de geração; ajustada para conferir a chamada correta.
42
+ - Avaliações reais: capacidade teve revisão posterior aprovada; algoritmo e consulta ainda têm pendências. A validação integral da aula permanece pendente; o pedido de 03/10 mudou a prioridade para exportações pequenas, sem novos testes na aula longa.
43
+
44
+ ## Experiências exploráveis e autonomia — 02/10/2026
45
+
46
+ Plano completo e estado de retomada: `docs/PLANO-EXPERIENCIAS.md`. Pedido do usuário: implementar as sete frentes, registrar avanços e publicar etapas validadas.
47
+
48
+ - Publicado e mergeado: PR #115, main 5b7e20d. Sem mudanças em decks pessoais ou no Oracle.
49
+ - Implementado e validado: calc com cenários, comparação congelada, restaurar, previsão/revelação, curva ligada às entradas e selo ilustrativo; formulário; demo Explore uma ideia; estados e explicações no material de estudo.
50
+ - Agente: validação de fórmulas em estados/extremos; `review: true` fotografa estados e devolve achados ao agente para uma correção. Revisão indisponível permanece explicitamente sem conferência.
51
+ - Elementos: continuidade de posição/tamanho por nome entre cenas, respeitando movimento reduzido.
52
+ - Direção de arte: variantes podem propor tema para o conjunto com composição do conteúdo real, aplicação explícita na escolha.
53
+ - Avaliação: cinco pedidos independentes em `src/ai/evaluation.js`, execução real por `tools/evaluate-autonomy.mjs`, relatórios e decks na biblioteca. Tokens/custo medidos em escopo isolado por tarefa, quando informados pelo provedor; ausência não vira zero.
54
+ - Validação final: npm test, 691 testes; 671 passaram, 20 pulados, zero falhas. Testes específicos adicionais de Studio, IA, contraste, continuidade, estudo offline e medição concorrente passaram. Bundle atualizado.
55
+ - Avaliação real: duas rodadas de cinco casos. Segunda rodada: geometria e narrativa conferidas; demais com pendências explícitas. A avaliação identificou contraste ruim de resultados alterados e escala ausente na curva: corrigidos no motor, sem retocar os exemplos.
56
+ - Formulário extraído para calc-fields.js; prévias de direção em iframe isolado (art-preview.js), sem vazamento de CSS. Limite de tamanho do formulário reduzido.
57
+ - Porta atual por instrução expressa do usuário: 3517. O processo SagaDeck anterior foi substituído; wotan-router em 3001 preservado. Demo: /editor?model=explorar. Sem deploy remoto.
58
+
59
+
60
+ ## Senso crítico da recriação: a IA ganha ferramentas para se corrigir — 02/10/2026
61
+
62
+ Feedback da versão "escalafobética" da Aula 1 (relevo): foco guiado todo fora do lugar, mapa do posto
63
+ fluviométrico ainda em xerox, hidrograma com a imagem da equação de P, "[object Object]", texto gigante, superfície
64
+ 3D de enfeite ("girar o relevo") e o ciclo em camadas de cabeça para baixo. A conferência visual procurava
65
+ informação faltando, não desenho, e a IA não tinha como medir onde ficava cada coisa na figura.
66
+
67
+ - **Foco guiado ancorado pela visão** (`src/ai/ground.js`): depois das imagens prontas, a visão localiza cada
68
+ destaque na imagem (caixa em % da figura); recriação e geração usam. Antes as coordenadas eram chutadas.
69
+ - **A visão vê arquivo por arquivo**: com mais de uma imagem no slide, cada uma vai com o nome; cada figura sai com
70
+ `arquivo`. A escritora recebe `(arquivo X)` antes de cada figura (pegava a fórmula no lugar do hidrograma).
71
+ - **Redesenho automático** da ilustração escaneada/pixelada que a escritora deixou como estava (`image_prompt` +
72
+ `image_ref`, copiando os rótulos lidos pela visão).
73
+ - **Imagem de equação** num slide novo volta para a correção: escrever em LaTeX.
74
+ - `table.side` aceita elemento (era o "[object Object]"); `statement` não deixa a IA pôr frase longa em `h2`.
75
+ - Infográfico **`camadas`**: perfil físico de cima para baixo com setas de fluxo (`flows`). Regras: camadas
76
+ físicas vão nele; `plot.surface` só com função/dado do material.
77
+ - Conferência visual com "crítica de desenho": destaque fora do lugar, figura errada, equação como imagem, gráfico
78
+ de enfeite, ordem física invertida, texto gigante.
79
+ - Testes: `test/camadas.test.js`, `test/transform.test.js` (visão por arquivo, equação, foco ancorado),
80
+ `test/retorno-recriada.test.js`.
81
+
82
+ **2ª rodada (mesmo dia): a autocrítica não respondia.** A conferência visual falhou em 5 lotes ("resposta sem JSON").
83
+ Sondado com o modelo de verdade: com o lote inteiro numa chamada, o DeepSeek Flash pensava até estourar o limite
84
+ (16 mil tokens de raciocínio, texto vazio) ou aprovava tudo sem olhar; até de um slide só entrava em laço. Sem
85
+ raciocínio, a mesma conferência sai em 1–2 s e acha o que importa (título repetido, metade vazia, texto cortado).
86
+
87
+ - `chat(..., { think: false })` pede `reasoning: {enabled: false}`; provedor que recusa o campo (400) leva a chamada
88
+ de novo sem ele, e o sagadeck lembra. Usado na conferência visual e na localização dos destaques.
89
+ - Conferência visual: um slide novo por chamada (com o original dele), 4 em paralelo; slide sem resposta fica só ele
90
+ sem conferência (aviso no relatório); a resposta sem JSON fica em `falhas/conferencia-N.txt`; vale a lista de
91
+ problemas mesmo com `"ok": true` junto (o achado se perdia).
92
+ - Foco guiado: a mesma figura com os mesmos destaques não é localizada de novo a cada rodada de correção (memo);
93
+ `figure: caminho.png` (texto, não objeto) também é localizada (o Vacununga ficava com as caixas chutadas); a visão
94
+ que não responde vira aviso no relatório; caixa do tamanho da figura inteira não vale (fica a da escrita).
95
+ - Redesenho automático: sem a moldura de print (janela do leitor de PDF, barra de ferramentas); o texto alternativo
96
+ é o que a figura mostra, não o pedido ao modelo de imagem.
97
+ - Dois gráficos em colunas lado a lado dividem a linha por igual (o primeiro saía minúsculo).
98
+ - Limites da tarefa: `calls` (300) conta só as chamadas que escrevem e pensam; as de olhar (`think: false`) têm o
99
+ próprio `looks` (2000). A rodada 3 parou no "Limite de 300 chamadas" com a conferência por slide.
100
+ - Rodada 4 (19 min, completa): os 7 pontos do retorno resolvidos. Duas regras novas de prompt: tema com identidade
101
+ própria não leva paleta sem pedido de cores ("sóbrio" virou `grafite` e o relevo saiu claro, destaques em tarja
102
+ cinza); quebra de linha do PowerPoint no meio da frase é juntada (frases picadas nos slides de chuva de projeto).
103
+ - Rodada 5 caiu no plano: "nada chegou em 180 s" duas vezes. O modelrelay descartava os keep-alives e o
104
+ raciocínio, e o modelo que pensa por minutos parecia morto. modelrelay 0.2.2 (naruminho/modelrelay#8): evento
105
+ `alive` e o comentário SSE `: alive` enquanto ele pensa; aqui `MIN_MODELRELAY` e o extra `ia` foram para 0.2.2.
106
+ - Ainda abertos: slides repetidos às vezes (declividade em dois slides seguidos); equação pequena num canto
107
+ (IDF de São Carlos); o modelo pede pouca ilustração nova mesmo quando o pedido quer "imagens realistas".
108
+ - Testes: `test/llm-raciocinio.test.js`, `test/ground.test.js`, `test/blocks-graficos.test.js`, `test/transform.test.js`.
109
+
110
+ ---
111
+
112
+ ## Pesquisa na web para gerar material (estilo deep research) — fase 1 feita em 02/10/2026
113
+
114
+ - Aprovado e pedido: a IA distingue quando o que ela sabe basta (hash table) e quando pesquisar (ranking das IAs de
115
+ fronteira, calendário dos próximos filmes, tecnologia que só existe em artigo: o paper, e o preprint se o artigo
116
+ estiver fechado), e transforma o material denso em reportagem (Superinteressante), lendo vários formatos.
117
+ - `src/research/research.js`: decidir (com a data de hoje; acadêmico ou não; buscas) → buscar (DuckDuckGo e, no
118
+ acadêmico, a API do arXiv) → escolher as fontes (oficial, acadêmica, imprensa séria, referência; descarta blog,
119
+ fazenda de conteúdo, agregador) → ler (`fetchUrlDoc`: página, PDF até 15 MB, docx, pptx, xlsx, texto; artigo que só
120
+ deu o resumo vai ao preprint) → anotar (fatos com o trecho). Materiais [F1]… num bloco próprio ("FONTES DA PESQUISA
121
+ NA WEB"), a regra de citar no slide e fechar com `references`, e tudo em `contexto/pesquisa/` (fontes.json,
122
+ notas.md, o texto de cada fonte). Sem internet ou `SAGADECK_WEB=0` (a rede do banco): avisa, não inventa dado
123
+ recente e pede links/anexos. Preferências › IA › "Pesquisar na web quando precisar"; `sagadeck new --sem-pesquisa`.
124
+ - Ligado na geração de deck (Studio: Criar com IA e biblioteca; `sagadeck new --prompt`). Falta (fases 2 e 3): no chat
125
+ de um deck aberto; figuras de dentro dos artigos e prints de páginas oficiais; outros buscadores.
126
+ - Testes: `test/research.test.js` (web e LLM falsos; ao vivo, a decisão nos 4 exemplos da pessoa).
127
+
128
+ ### O plano original (02/10)
129
+
130
+ - Pedido: "faça um tutorial de interpretabilidade com SHAP" e o sagadeck pesquisa, baixa páginas, PDFs, artigos e
131
+ figuras de fontes confiáveis (documentação oficial, repositório, artigos, livros de referência; nunca o blog que
132
+ "delira"), lê, tira prints/figuras, plota e desenha esquemas que não existem, e gera os slides com a fonte de cada
133
+ informação. Opção caseira: no banco a internet é barrada e a tarefa avisa claramente (cole links/anexe arquivos).
134
+ - Forma: uma tarefa em etapas comandada pelo código, como a transformação (salva em disco, retomável, limites de
135
+ chamadas/tokens/minutos, relatório), dentro do sagadeck. Não é o runtime de agente compartilhado (adiado em 29/09).
136
+ - Etapas: planejar (perguntas e roteiro) → buscar (buscador trocável: DuckDuckGo, que já existe; busca do Gemini
137
+ com grounding; pesquisa web do OpenRouter) → filtrar fontes (oficial > acadêmico > referência; o resto descarta ou
138
+ marca como contexto) → baixar para `contexto/pesquisa/` (texto limpo, PDF, figuras com legenda; origem e data) →
139
+ ler e extrair (notas com citação; visão nas figuras; o Chrome fotografa o trecho da documentação ou a figura da
140
+ página do artigo) → gerar (figura original com crédito quando é a melhor; gráfico dos dados; esquema/ciclo novo;
141
+ imagem de IA só ilustrativa) → conferir (fiscal, visão e toda afirmação com número/fato vinda de fonte lida).
142
+ - Fases: 1) busca com filtro, ler páginas e PDFs, slides com fonte, print de página oficial; 2) figuras de dentro
143
+ dos artigos, plot dos dados, esquemas novos; 3) outros buscadores e o aviso do banco refinado.
144
+
145
+ ## Link para ver, só leitura (compartilhar com a Mary) — 01/10/2026
146
+
147
+ - Pedido: no servidor da Oracle (login do portal), mandar o link de UMA apresentação para a Mary, só para ver.
148
+ - `src/studio/share-routes.js`: Arquivo › Compartilhar link (`share-ui.js`, janela própria; app.js no limite). Código
149
+ de 144 bits por link, em `<biblioteca>/.compartilhados.json` (dono, id do deck, público?, com as notas?).
150
+ `/ver/<código>`: no multiusuário exige o usuário do portal; `/publico/<código>`: só se o link é público. A página é
151
+ a apresentação montada na hora (a versão atual), sem as notas (a não ser que marcado), com noindex, no-referrer e
152
+ no-store. Revogar: só o dono; o de outra pessoa nem aparece.
153
+ - oraculo-workspace: nginx `location /sagadeck/ver/` (`auth_request /_session`: qualquer logado, mesmo sem o app
154
+ sagadeck) e `/sagadeck/publico/` (sem sessão, cabeçalho de usuário vazio, só GET); `infra/DEPLOY-sagadeck.md`.
155
+ - Quem recebe também baixa (pedido: "quero q ela consiga baixar pra ela se precisar nos formatos possiveis"): botão
156
+ Baixar na página do link (`<link>/baixar/<formato>`): PDF, PowerPoint, HTML para apresentar sem internet, material de
157
+ estudo (PDF e HTML) e `.sagadeck`; roteiro e "tudo" só no link com as notas (são feitos delas). Sem as notas, nenhum
158
+ arquivo as leva. Um arquivo por vez por link (PDF/PPTX usam o Chrome do servidor). Mesmas regras de acesso do link.
159
+ - Teste: `test/share.test.js` (Studio local pelo menu; multiusuário por HTTP), `tests/test_portal_app_access.py`.
160
+
161
+ ## Revisão das 4 versões da Aula 1 pelo fiscal: acabamento do motor e transformação mais rápida — 01/10/2026
162
+
163
+ - Método: o fiscal do sagadeck (`src/export/shots.js: check`) em todos os slides das 4 versões + fotos dos acusados.
164
+ Antes: melhorada Flash 22 achados, Pro 36, recriada Flash 10, Pro 18. Depois: melhorada Flash 0 (o resto é letra
165
+ miúda pedida pelo conteúdo e casos pontuais). As correções são do motor: valem para os decks já gerados.
166
+ - **Faixa do título do mestre** cortava a perna do q/g/ç e a 2ª linha, e não encolhia: o título do estilo vem com
167
+ `font-size !important` e o ajuste mudava `style.fontSize` sem efeito. Agora `setProperty(..., "important")`, sem
168
+ tolerância quando a caixa esconde a sobra, `data-fit-self` (encolhe só pelo próprio tamanho), cabeçalho da faixa sem
169
+ o gap/padding do layout e folga de .1em embaixo.
170
+ - **Largura que não cabe** (`fit.js: fitWide`): fórmula `$$…$$` mais larga que o slide encolhe até caber; palavra
171
+ maior que a caixa (rótulo ENTÃO de 64 px em 140 px, "probabilidade" num cartão) encolhe até 50% (o Chrome daqui
172
+ não hifeniza português; partir a palavra ficou feio). Antes o "encolher tudo" deixava o slide inteiro miúdo.
173
+ - **Cor `hi` como texto**: em estilo tirado do PowerPoint era azul-bebê no branco; `--hi-ink` (o hi se dá para ler,
174
+ senão a ênfase, senão o texto).
175
+ - **Tabela em markdown** (`| a | b |`, com `|---|`) em qualquer texto vira tabela de verdade (a IA escrevia assim
176
+ dentro de passo do `solution` e saía cru).
177
+ - **`solution`**: dado e "pede-se" em frase saem como texto ("ver tabela" virava "vertabela" em itálico); os passos
178
+ encolhem (até 60%) antes de cortar o primeiro no último clique, e sem o esmaecido quando cabem; "Pede-se" não
179
+ quebra no hífen. Fórmula no meio do texto no tamanho da letra (o KaTeX aumentava 21%).
180
+ - **Imagem**: solta no `add` com `w: 100%` ocupava tudo e espremia o layout até altura 0 (agora 420 px no máximo,
181
+ como sem tamanho; esse caso antes não tinha teste); figura sem `fit` cabe inteira quando o corte passaria de 20%
182
+ (gráfico perdia eixo e legenda), medido no navegador com a caixa real (`data-autofit`, `fitImages`).
183
+ - **`science` só com equação** (`plot: false`) espremia os cartões do `add` por baixo da fórmula.
184
+ - **Fiscal**: contraste pelo que está de fato embaixo do texto (a pílula SVG do infográfico; antes "branco no
185
+ branco"), marca-texto no título não é estouro. Falso alarme virava correção à toa da IA.
186
+ - **Transformação**: a conferência roda o fiscal nos slides escritos (problema exato, com o texto do objeto, para a
187
+ correção) antes da visão; blocos em paralelo (3; `SAGADECK_TRANSFORM_PARALLEL`); no fim, pendente por fato é
188
+ conferido de novo contra todos os itens irmãos prontos (o fato que outro bloco levou não é pendência).
189
+ - CI do Windows: o teste do modelo lavanda contava a imagem da prévia antes de ela entrar.
190
+ - **Recriada sem a moldura antiga**: na Aula 1 a moldura foi copiada slide a slide (sem `deco`), então o filtro por
191
+ `deco` não tirava nada. `repeatedFrame` (src/master.js, a mesma detecção do estilo) acha o que se repete na mesma
192
+ posição; o motor não desenha isso nos originais de um deck `recreatedFrom` (vale para as recriadas já geradas) e a
193
+ transformação tira ao montar. Número da página, data e rodapé do original também saem. Na detecção, elemento que
194
+ não é imagem/desenho/caixa de texto tinha a chave "?" + posição (dois conteúdos no mesmo lugar viravam moldura).
195
+ - Visão (VER) também em lotes paralelos.
196
+ - Pergunta: "você pediu para seguir um tema?". Sim (tema prata ou manual, paleta floresta ou mar, purpose consulta);
197
+ a IA escolheu manual, mas a paleta se perdia (o plano só tinha "tema") e o propósito era sempre palestra (fixo no
198
+ código e numa regra do prompt). Agora o plano devolve `paleta` (recriar) e `proposito`, e quem escreve recebe a
199
+ regra do propósito escolhido.
200
+ - Rodada ao vivo (01/10, Flash, código e37b1bf, figuras do cache): pedido curto em 26 min (antes 63), 81 slides, 4
201
+ pendentes, 17 pontos de desenho, tema prata, fiscal só com 5 letras pequenas. O pedido detalhado parou no PLANO:
202
+ `SAGADECK_LLM_TIMEOUT` era o tempo TOTAL da chamada, e em streaming o relay só manda os cabeçalhos quando o modelo
203
+ começa a escrever. Agora são dois limites (llm.js): até a 1ª palavra (`SAGADECK_LLM_FIRST_TIMEOUT`, 600 s) e sem
204
+ chegar nada (`SAGADECK_LLM_TIMEOUT`, 180 s). `test/llm-timeout.test.js`. Achados para depois: pendente falso por
205
+ coordenada de mapa (7606, 7608…) e por palavra comum com maiúscula ("Para", "Seção", "Hidrográfica"); correção que
206
+ falha por formato de gráfico e por YAML nas notas; visão "sem JSON".
207
+ - Na 2ª tentativa do pedido detalhado, o chat gravou o resultado na recriada da rodada 1 (81 → 130 slides): o Studio
208
+ local tem UMA apresentação aberta para todas as abas e aparelhos; depois do reinício, uma aba aberta na recriada a
209
+ reabriu logo depois de o script abrir o original, e o chat grava em W.file (o aberto naquele instante), não no que
210
+ quem pediu estava vendo. A rodada 1 foi remontada da tarefa salva (os 69 itens prontos; montar é código, sem
211
+ modelo; mesmo resultado: 81 slides, 4 pendentes, 17 a conferir). Correção: a aba manda `expectFile` (o arquivo que
212
+ está vendo) ao salvar, no YAML e no chat; se o Studio está com outro aberto, 409 e "Recarregue" (nada é gravado).
213
+ `test/stale-tab.test.js`.
214
+ - Retorno da pessoa sobre a recriada da rodada 1 (10 pontos + "tema sem graça"), causas e correções:
215
+ - tabela numa linha só (o YAML juntou as linhas), fórmula entre \( \) e \[ \], \frac (barra dobrada vira
216
+ quebra de linha no LaTeX): `md` aceita os três;
217
+ - legenda por cima do gráfico no layout `image`: com `fit: contain`, a legenda vai embaixo (foto segue com o cartão);
218
+ - tabela do `add` espremendo o layout e ficando por cima do texto: no máximo 45% da altura (a letra encolhe); o
219
+ ajuste e o fiscal veem a tabela;
220
+ - equação e tabela repetidas como imagem e slides "versão alternativa"/"imagem original": a conferência cobrava
221
+ TODA imagem do plano ("faltou imagens") e a IA repunha; não cobra mais. O que a visão leu numa figura vira dica na
222
+ correção, não pendência (fim das pendências por coordenada de mapa). Regra nova: critério de designer (redesenhar
223
+ quando dá sem perder nada, manter só o insubstituível, nunca as duas);
224
+ - ciclo hidrológico em fluxograma (setas de volta cruzando tudo): infográfico `ciclo` novo (etapas numa elipse,
225
+ setas curvas na cor de cada uma) e a referência manda ciclos para ele;
226
+ - recriar sem tema pedido: visual marcante e diferente do original (cor, paleta viva ligada ao assunto).
227
+ - Rodada 02/10 (pedido curto, a11fc5a): 24 min, 81 slides, 3 pendentes; tabelas reais, fórmulas certas, curvas IDF
228
+ redesenhadas pela equação (science). Ainda: tema manual (branco) apesar da regra; ciclo ainda em diagram; gráfico
229
+ em `image` sem `fit: contain` (legenda por cima); exercício novo com série INVENTADA (120, 95, 150…), que não
230
+ existe no original. Correções: regra explícita de ciclo → `shape: ciclo`; exercício novo prefere os
231
+ dados do material quando houver; imagem do original que a visão viu como não-foto sai `fit: contain` por código
232
+ (wholeFigures). Tema: a pessoa corrigiu, "colorido" era a preferência DELA para esta aula, não regra: o recriar
233
+ segue o tema/jeito que o pedido disser e, sem nada, a IA escolhe; o "bonito e colorido" vai no pedido do chat.
234
+ Também não obrigar "dados fictícios" (é comum pedir material completo com dados, exemplos e exercícios gerados).
235
+ - Retorno sobre a rodada 02/10 (a11fc5a), causas e correções:
236
+ - capa velha antes da nova e "Componentes do ciclo" com desenhos velhos semi-transparentes: no recriar, pendência
237
+ punha o original ao lado e "juntar" guardava os desenhos do original. Agora juntar vira escrever e pendência
238
+ vira proposta marcada "revisar" (com o que faltou), sem o original;
239
+ - setas do Mermaid em degraus ("raio do Darkseid") e pontas tortas: ligações curvas por padrão (`curve: angulo`
240
+ ou `reta` por slide); rótulo com parênteses sem aspas (quebrava o diagrama da delimitação) ganha aspas;
241
+ - gráfico com o tipo como chave (`{ line: {…} }`) sumia em silêncio: desenha; sem tipo, erro para a IA;
242
+ - dois gráficos num row com 300 px: dividem a largura; `title` do gráfico e `caption` do blocks aparecem;
243
+ - ícone sozinho no split parecia sujeira: grande, num disco; regra para preferir gráfico/esquema do conceito;
244
+ - statement com parágrafo em letra de título: tamanho pelo comprimento; layout novo `definition` (verbete) para
245
+ "o que é X" (termo, origem em partes, definição, ícone);
246
+ - layout image com figura inteira: título no alto e legenda pequena embaixo (não a frase gigante);
247
+ - faixas claras fora da capa na apresentação: slide com moldura até a borda (canvas, mestre) tem fundo escuro fora;
248
+ - erros de digitação ("Méodo", "Refrências"): quem escreve confere a ortografia e a conferência visual aponta.
249
+ - Rodada colorida 7381869 (02/10, 48 min): nenhum original voltou ao lado, mas 4 lotes perderam a correção (YAML
250
+ quebrado: `mudou: "Ajute" corrigido…` e texto com ": " que segue na linha de baixo; a correção desistia na 1ª) e 4
251
+ ficaram sem conferência visual (sem JSON duas vezes). Agora: o conserto de YAML pega os dois casos; a correção
252
+ volta com o erro e tenta de novo; a visão sem JSON confere em duas metades. `$2$` (número sozinho) é fórmula;
253
+ `t~c~` e `m^2^` (índice/expoente, a IA usa sozinha) desenham.
254
+ - **As rodadas "Flash" de 01-10 e 02-10 escreveram com o Pro**: o `modelrelay serve` não relê o config editado à mão
255
+ (só o salvo pela tela dele) e seguia com `text = deepseek-v4-pro`. Renomeadas para "Pro · rodada…". O Pro (pelo
256
+ OpenRouter) come letras ao escrever, ~0,5% das palavras ("Ajute", "probailidade", 40 na melhorada Pro); o Flash,
257
+ medido na mesma tarefa, nenhuma. A conferência por código (`typosOf`: palavra do original com uma letra a menos no
258
+ meio, ou sem acento) vai como DICA na correção (acha também palavras certas: "estão" de "gestão"). modelrelay 0.2.1:
259
+ o fim do stream diz o modelo resolvido (o relatório mostrava só "text"); falta publicar no PyPI.
260
+ - Na mesma rodada: kicker `^^…^^` sumia nos temas com pílula (oceano, sinal…: a ênfase tinha a cor da pílula; a
261
+ "pílula vazia" do ciclo). Cartões da mesma grade encolhiam cada um por si (`fitWide`, palavra comprida num cartão
262
+ estreito) e ficavam de tamanhos diferentes: agora os irmãos ficam com o menor.
263
+ Gráfico de linhas: o eixo arredondava para inteiro (0 a 1 mostrava só "0" e "1"): marcações redondas (`niceTicks`,
264
+ com as casas do passo); linhas que terminam juntas (as curvas hipsométricas em 1) empilhavam os nomes: legenda em
265
+ cima (também com `legend: true`); rótulo numérico do eixo x com vírgula. Rodapé numa linha só (reticências).
266
+ - Pedido (02/10): figura de xerox/escaneada não é para virar diagrama nem ficar feia: **redesenhar como ilustração
267
+ com o modelo de imagem**, a partir dela. A visão marca `qualidade: ruim`; o escritor pede `image_prompt` +
268
+ `image_ref` (a figura original como base); o lote gera em `imagens/ia/` ANTES da conferência visual (que compara
269
+ o redesenho com o original); falhou, volta a figura de base. Teste à mão com o mapa de ruas (image8): pedindo
270
+ "contornar por cima, mesma proporção, rótulo letra por letra" sai fiel (erra 2 ou 3 rótulos); sem isso, o modelo
271
+ reenquadra e inventa rótulos. Também: em deck novo, pedido que não fala de imagem → a IA decide onde ilustrar
272
+ (antes nunca gerava). Paralelismo do transform: 8 lotes (até 16).
273
+ - Pedidos de 02/10, analisados slide a slide (decks em `Pedidos de teste/`):
274
+ - **brigadeiro "one page tipo Nature"**: a IA usou o `onepage` (de projeto: jornada, problema, solução) e a receita
275
+ saiu "brigadeiro de festa × gourmet", letra miúda, sem ilustração. Layout novo **`poster`**: ilustração principal
276
+ e painéis com letra (a, b, c), desenho, texto curto, números e setas; a referência manda usar este para
277
+ infográfico de uma página. Na versão 2 a IA usou o pôster, mas pôs título/tema/paleta dentro de `deck:` (o jeito
278
+ do patch) e o deck saiu "Nova apresentação" no tema padrão: a geração agora entende o `deck:`. Com ilustração
279
+ principal, no máximo 3 colunas (2 até 4 painéis).
280
+ - **regressão logística para 11 anos**: a versão 1 dizia "olha as pistas, dá uma nota, responde" sem o
281
+ mecanismo. Regra no prompt de geração: ensinar como algo funciona = o mecanismo inteiro, um exemplo de números do
282
+ começo ao fim, a conta de cada passo, uma simulação e uma rodada do ajuste; criança: simplificar as palavras,
283
+ nunca os passos. A versão 2 ensina (pontos por pista, soma, curva em S, 50%, ajuste, calculadora).
284
+ - motor: `:x:` (ícone de uma letra) no diagrama; `{ text: nuvens, vento, umidade }` virava campos vazios;
285
+ unidade `%` quebrava a fórmula do exercício resolvido; passos anteriores miúdos mesmo com espaço (agora só quando
286
+ não cabem); compare com texto curto virava dois cartões vazios do tamanho do slide; eixo do Plotly com vírgula;
287
+ ilustração gerada sem `fit` (era sempre `cover` e cortava a criança da capa); gráficos empilhados no `blocks`
288
+ (rótulo + gráfico vira título; dois ou mais lado a lado); `$1 - P(X \geq x)$` cru (regra do Pandoc para `$`);
289
+ anos no eixo sem ponto de milhar.
290
+ - rodada colorida com o Flash de verdade (1107fd1, 72 slides): nenhum lote falhou, 1 erro de grafia ("LENCOL").
291
+ - rodada com redesenho (ddde26a, 102 slides): só 1 figura redesenhada, porque a visão marcou 1 de 72 como "ruim"
292
+ (achou boa até o mapa de xerox) e a regra só valia para figura específica (o ciclo da água, genérico, virava
293
+ diagrama). Agora a visão diz a `aparencia` (digital, foto, escaneada, pixelada) e ILUSTRAÇÃO escaneada ou
294
+ pixelada, genérica ou específica, volta como ilustração. Ilustração nova sai sem texto (o modelo escrevia
295
+ rótulos em inglês e palavras sem sentido); o redesenho mantém os rótulos.
296
+ - na mesma rodada: correção sem bloco ("nada a corrigir") contava como falha → fica como está; lote cuja
297
+ resposta parava no meio perdia os itens → os que faltaram vão de novo, um por vez. Respostas que não serviram
298
+ ficam em `.sagadeck/transform/falhas/` (as 40 últimas).
299
+ - Casos de 02/10 (decks em `Pedidos de teste/`):
300
+ - **Apple prateado**: o `prata` (fiel ao branco da Apple de hoje) achado sem graça. Tema novo **`aluminio`**: a cara
301
+ dos lançamentos de iPhone e iPad de 2020-2021 (prata metálico com brilho de estúdio, alumínio escovado, título
302
+ cromado com a cor sólida em `color` para o fiscal medir, disco de metal polido na capa e na seção, cartões de
303
+ alumínio com chanfro, seção em azul-pacífico, escuro em grafite).
304
+ - **história dos videogames em 5 slides, temática, o último como mapa de Mario Kart visto de cima**: saiu no tema
305
+ alegre genérico e o último era um ciclo de bolinhas. Infográfico novo **`pista`** (circuito visto de cima: grama,
306
+ zebra, asfalto, largada quadriculada, caixas de item; os itens como marcos da volta e as placas em fila em cima e
307
+ embaixo, sem encavalar) e tema **`arcade`** (tela de tubo com linhas de varredura, neon, títulos em Press Start 2P,
308
+ rótulos em VT323, cartões de 8 bits, chão de tijolos na capa; fontes OFL embutidas).
309
+ - **transformers denso como aula**: bom de conteúdo (intuição, tokens, atenção com números, softmax, Python, tabela
310
+ da próxima palavra, temperatura, perda, limites). Ficou para depois: fluxo de 10 a 12 caixas em fila sai miúdo.
311
+ - **calendário dos próximos filmes da Marvel** (pesquisa): a IA fez linha do tempo porque não havia calendário.
312
+ Layout novo **`calendar`**: um cartão por mês com evento, o mini calendário com os dias marcados na cor do tipo
313
+ (Filme, Série: cores de item do tema, com legenda), a lista embaixo e o cartão "sem data". A versão nova da
314
+ pesquisa leu 7 fontes e montou o calendário de verdade.
315
+ - correção: a igualdade de tamanho entre cartões irmãos agrupava pela primeira classe do texto, que às vezes é a
316
+ genérica `t` (todo texto do cartão ia para o menor: o mês do calendário com 15 px); agora agrupa pelo papel.
317
+ - **versão escalafobética da aula da Maria** (imagens realistas e tecnológicas, gráficos de ficção científica sem
318
+ néon, 3D bonito como um bloco de terreno): tema novo **`relevo`** (grafite profundo, curvas de nível, cantoneiras
319
+ de mira, vidro fosco, rótulos técnicos em monoespaçada, título leve). A IA escolheu o relevo, gerou 11 ilustrações 3D realistas
320
+ e 3 gráficos 3D; mas pôs a paleta `safira` (clara) e o texto saiu escuro no fundo escuro: as peles com fundo
321
+ desenhado (relevo, arcade, aluminio) pintavam cores fixas e ignoravam a paleta; o fiscal não viu (mede contra a
322
+ cor declarada). Agora o fundo, o metal e o vidro saem de --bg/--fg/--hi/--surface; `test/temas-paleta.test.js`
323
+ mede o PIXEL do fundo (relevo+safira dava 1,22). A referência avisa que paleta clara deixa o tema escuro claro.
324
+ - Infográfico: o palco (1680 × 700) cabe na altura que sobra quando há algo no `add` (vazava por baixo do aviso;
325
+ `fitStages`); as caixas de texto dele encolhem só pelo próprio tamanho (`data-fit-self`: a descrição caía para 13 px
326
+ por causa de outro texto); o texto do `aviso` tem `.t` (o ajuste e o fiscal não o viam). Fiscal lê `color(srgb …)`
327
+ (color-mix) de 0 a 1 (dava "baixo contraste" em texto escuro no cinza-claro); rótulos do `solution` com 20 px.
328
+ - Fiscal final (01/10): melhorada Flash 0, recriada Flash 0, melhorada Pro 5, recriada Pro 7. O resto é conteúdo
329
+ grande demais (exercício com uma tabela enorme por passo, que nem a 60% cabe: dividir) e letra miúda pedida no
330
+ slide; numa transformação nova o fiscal devolve isso para a IA.
331
+ - Testes: `fit-wide.test.js`, `check.test.js`, faixa em `style.test.js`, tabela em `markup-math.test.js`, solution em
332
+ `lessons.test.js`, paralelo e fiscal em `transform.test.js`.
333
+
334
+ ## Relatório do GPT, 1º pacote: identidade persistente e transformação confiável — 30/09/2026
335
+
336
+ - **Identidade**: todo slide tem `uid` (`src/uid.js`, dado no GET do deck e ao gravar; `data-uid` no HTML). A
337
+ chave do ajuste visual passou a ser pelo CONTEÚDO do objeto (`grupo~impressão`, `~2` para iguais), não pela
338
+ ordem: inserir, reordenar ou apagar outro objeto não passa o ajuste para quem não era. Chave antiga (`grupo-N`)
339
+ continua valendo e é convertida ao abrir (`src/studio/visual-keys.js`: `migrateLegacyKeys`); texto do objeto
340
+ mudou: o ajuste acompanha (`carryVisualEdits`, no POST do deck e no chat). A junção com a IA é por uid, campo a
341
+ campo, e os ajustes por chave (`merge-decks.js`). Teste: `test/identity.test.js`.
342
+ - **Transformação** (`src/ai/transform.js`): tarefa persistente em `.sagadeck/transform/tarefa-<modo>.json` (salva a
343
+ cada etapa e bloco; pedir de novo retoma sem replanejar; o melhorar retomado parte de `original/original.yaml`);
344
+ Parar de verdade (signal até o `fetch` do modelo: `AbortSignal.any` no llm.js; botão Parar na bolha do chat;
345
+ `/api/ai/transform/cancel`); a tarefa segue no servidor se o navegador fechar e a página reaberta acompanha
346
+ (`/api/ai/transform/status`); limites de chamadas, tokens e minutos (`SAGADECK_TRANSFORM_CALLS/TOKENS/MINUTES`)
347
+ com resultado parcial (o que não saiu fica como no original); cache das figuras pela foto (sha1 + versão da
348
+ análise; falha não entra); conferência visual de novo depois de cada correção; faltou fato do original mesmo
349
+ depois da correção: o original fica e a proposta vem `review: pendente` (aceitar tira o original do par,
350
+ desfazer tira a proposta); problema de desenho: `revisar`; estados da tarefa concluido / parcial / revisar; mapa
351
+ de cobertura `original/cobertura-<modo>.md/.json` (cada texto, fórmula, tabela, imagem e nota do original e em
352
+ que slide novo foi parar). Recriar retomado atualiza a MESMA apresentação nova.
353
+ - **Faixa Design** transbordava abaixo de ~1450 px (as duas galerias exigiam 3 cartões cada): agora encolhem até 1
354
+ cartão; dica "botão direito" saiu do rótulo (já está no tooltip do cartão); aviso das fontes limitado na janela
355
+ estreita. `test/ribbon-fit.test.js`: todas as abas de 1920 a 900 px (1093 = 1366 com zoom de 125%).
356
+ - **Instância local única** (`src/studio/instance.js`): porta 3517 no CLI, `npm run dev` e `sagadeck.studio()`;
357
+ `/api/instance` diz app, versão, processo e biblioteca; `sagadeck studio` com um aberto na porta (mesma
358
+ biblioteca e versão) só mostra a URL dele (com `?deck=` se pediu um deck); outra biblioteca ou versão: avisa e
359
+ não sobe outro. Versão e processo no log de início. `test/instance.test.js`.
360
+ - **Desfazer / refazer único** (`src/studio/public/history.js`): toda mudança do deck (formulário, tela, YAML,
361
+ assistente de IA, revisão, estilo, proporção, imagem gerada) é um passo com rótulo da origem; botões na barra de
362
+ título, Ctrl+Z / Ctrl+Y / Ctrl+Shift+Z e na busca de comandos; dentro de campo de texto vale o do campo; digitação
363
+ no mesmo campo junta num passo (mesmos caminhos no deck, 1,5 s), arrastar e apagar são dois; o editor visual
364
+ deixou de ter um desfazer próprio. `test/undo.test.js` e o passo da IA em `studio-ai.test.js`.
365
+ - **Ao vivo (Aula 1, 83 slides)**: o Flash caiu aos 5 min numa chamada: o `fetch` do Node desiste se os cabeçalhos
366
+ não chegam em 300 s. Agora a transformação chama em streaming (e mostra os caracteres chegando), a chamada comum
367
+ refaz em streaming nesse caso, erro passageiro (rede, 5xx, 429) tenta de novo uma vez e um bloco que não sai fica
368
+ registrado sem derrubar a tarefa (parcial; pedir de novo faz só ele).
369
+ - **Editor visual sem YAML** (`visual-editor.js`, `inspector.js`, `visual-edits.js`): alinhar (6) e distribuir;
370
+ copiar/colar estilo (Ctrl+Alt+C/V); travar (clique atravessa; `deco` do PowerPoint já vem travado); lista
371
+ **Objetos do slide** no inspetor (seleciona o travado, oculta, trava); guias magnéticas no arrasto (bordas e
372
+ centro do slide e dos objetos; Alt solta); trocar imagem com encaixe e ponto de foco (a chave do objeto não muda);
373
+ clique sem arrastar num dos selecionados fica só com ele. Texto, tabela e desenho importados do PowerPoint
374
+ (`tbx`, `tbx-table`, `drw`) passaram a ser objetos ajustáveis. `test/editor-tools.test.js`.
375
+ - **Palco × estudo** (`src/export/estudo.js`): campo `consulta:` do slide (escrito ao lado das anotações) só vai
376
+ no material de estudo; Arquivo › material de estudo (PDF ou HTML), "Ver o que o aluno recebe" na busca de
377
+ comandos, `sagadeck estudo deck.yaml [--html]`; cada slide inteiro (tudo revelado) + o texto de consulta, sem as
378
+ notas do apresentador. A referência pede para a IA pôr o aprofundamento em `consulta` numa palestra.
379
+ `test/estudo.test.js`.
380
+ - **Ao vivo, melhorar a Aula 1 pelo chat** (text = Pro × Flash; visão = Flash): Pro 47 min, 78 slides, 13
381
+ pendentes, 1 alerta; Flash 30 min (com queda e retomada), 85 slides, 6 pendentes, 5 alertas (achou a fórmula de
382
+ São Carlos do slide 68 e o Kf que não fecha nas unidades). Os dois: 394 e 402 de 454 trechos do original achados
383
+ como estavam. Defeitos do sagadeck achados e corrigidos: visão cortando o JSON (16 mil tokens, leitura tolerante,
384
+ refaz um a um); "MÁXIMA" virando sigla "XIMA"; palavra comum tomada por nome próprio; caminho de imagem com erro
385
+ de digitação; slide que quebra por formato sem dizer o que o layout espera; **linha do título do mestre cortando o
386
+ título e o texto** (faixa do título: `titleBand` em `src/master.js`, o cabeçalho vai acima do fio e o conteúdo
387
+ começa abaixo, vale para deck já gerado); capa repetindo logo e instituição da moldura e `dossier` (letra miúda)
388
+ numa palestra (regras no prompt; aprofundamento em `consulta`).
389
+ - **Arquitetura**: CI também no Windows (matriz ubuntu + windows); o CI estava vermelho desde o #59 (o motor
390
+ empacotado não achava o package.json); desempenho com 10/80/200 slides (`test/perf.test.js`: montar o HTML
391
+ 200 slides < 0,1 s aqui; Studio com 200 abre em ~2,5 s e troca de slide em 0,1–0,4 s).
392
+ - **Interação didática: prever → rodar → explicar** no `algo` (`predict:` abre com a aposta e as opções,
393
+ `explain:` fecha com o porquê e a resposta; vale para o rastreado); campos no formulário; `lessons.test.js`.
394
+ - **Variedade de conteúdo**: cada tipo de slide com o exemplo e com conteúdo longo, em 16:9 e 4:3
395
+ (`test/lengths.test.js`): o longo só pode deixar a letra menor, nada de vazar/cortar/sobrepor novo. Hoje passa
396
+ em todos. Rótulo do grupo do Estilo: "Organização".
397
+ - **Tabela de verdade** (`src/table.js`): layout `table` e elemento `table` (head/rows, objetos, csv colado,
398
+ lista de listas); cabeçalho na cor do tema com texto legível pela luminância, números à direita (algarismos de
399
+ mesma largura), zebra, destaque de linha/coluna/célula, total, estilos faixa/zebra/linhas/colunas/cartão, cor
400
+ c1–c5; encolhe para caber. Studio: Novo slide › Tabela, Inserir › Tabela, grade no Formatar que cola do Excel.
401
+ Transformação: a visão transcreve tabela em imagem inteira e a IA reescreve como `table` (recorte de livro vira
402
+ tabela real). `test/table.test.js`.
403
+ - **Recriar ao vivo, 1ª rodada**: a internet caiu no meio (DNS do openrouter) e os dois ficaram parciais
404
+ (retomáveis). Achados corrigidos: YAML da IA com ": " sem aspas e LaTeX em aspas duplas (` rac` virava caractere
405
+ de controle em silêncio) → consertado no parse; a IA pediu `table` (não existia); conferência visual "sem JSON"
406
+ tenta de novo e, no recriar, não cobra a moldura do original; fórmula `$…$` no meio do texto (KaTeX) em qualquer
407
+ campo.
408
+ - **Do log de conselhos (outro assistente)**, o que fazia sentido: registro de auditoria dos comandos da IA
409
+ (`~/.sagadeck/comandos.log`, com segredo mascarado; recusado/aprovado/liberado, saída e tempo); travas (os 3
410
+ monolitos não crescem: `test/guards.test.js`; todo `visualEdits` do motor está na referência); **Brand Kit**:
411
+ estilo padrão da biblioteca (`.estilos/padrao.json`), deck novo em branco ou com IA sem tema já nasce nele
412
+ (Design › Estilo › Usar em toda apresentação nova). Já estava feito: Plotly/Mermaid só entram no HTML quando o
413
+ deck usa (deck simples ~200 KB). Não feito, com motivo: ESLint/Prettier (reformataria o repositório inteiro,
414
+ com o GPT na mesma pasta), link público na nuvem (precisa de infraestrutura; o uso no banco é offline).
415
+ - **Recriar ao vivo, concluído** (retomado 2–3 vezes; a retomada funcionou): Flash 86 slides, 63 min, 6
416
+ pendentes, 5 alertas certos, redesenho mais uniforme (tabelas reais, gráficos dos dados, calculadoras ao vivo de
417
+ Kirpich, Watt e Chow e da IDF de São Carlos); Pro 88 slides, 75 min, 12 pendentes (várias falsas, de títulos em
418
+ caixa alta), mais slides originais mantidos. Correções vindas disso: LaTeX com barras a mais/a menos no YAML,
419
+ `origem` ausente/extra, figura que cortava informação (`cover` → `contain` quando a proporção não bate),
420
+ tabela que encolhia por culpa de outro texto (`data-fit-self`), equações do `science` maiores, regras (fórmula
421
+ em LaTeX sem repetir a imagem; gráfico nunca em `full`), frase em caixa alta não vira sigla, original sem a
422
+ moldura antiga no recriar, resultado no deck certo mesmo trocando de apresentação no meio, painel do token que
423
+ redesenhava sozinho (falhava no CI do Windows), teste do Python em UTF-8 (era a falha "conhecida" do Windows).
424
+ - **Biblioteca, tópico "Aula 1 — Manejo de Águas Pluviais"**: original importado + 4 versões (melhorada/recriada
425
+ × Pro/Flash). O melhorar foi refeito com o código atual (a 1ª rodada era de antes das correções).
426
+ - Falta: P1 (quebrar `app.js`/`server.js`; só a exportação saiu), comparar as 4 versões ao vivo e relatar; depois
427
+ desfazer unificado, editor visual (trocar/recortar imagem, alinhar e distribuir, guias, travar mestre, camadas,
428
+ paleta de comandos), palco × consulta, variedade, interações didáticas, arquitetura/CI.
429
+
430
+ ## Transformar a apresentação importada (melhorar / recriar) como tarefa agêntica — 30/09/2026
431
+
432
+ - Pergunta da pessoa: "as apresentações foram geradas 100% pelo sagadeck? o modo agêntico ia visualizar e arrumar
433
+ como você fez?" Resposta: não existiam ainda, e o ciclo ver → comparar → corrigir precisava ser do sagadeck.
434
+ - O chat decide (`transform: { mode, pedido }` no PATCH_FORMAT; só para deck importado — senão objeção soft).
435
+ `src/ai/transform.js`: VER (modelo de visão descreve as figuras: genérica × específica, dados legíveis; cache em
436
+ `.sagadeck/transform/`) → PLANEJAR (manter / juntar / escrever / novo; cobertura garantida por código) →
437
+ ESCREVER em blocos de 5 (cada slide com `origem` e `mudou`; imagens só as que existem; todo item precisa sair) →
438
+ CONFERIR (fatos por código: números nas duas leituras 0,385/0.385 e 10.000, siglas, nomes, imagens específicas;
439
+ desenho por visão: slide novo ao lado da foto do original) com uma rodada de correção → MONTAR (melhorar: estilo
440
+ extraído no mestre, `review` em cada mudança, `original/original.yaml`; recriar: deck novo no tópico, imagens
441
+ copiadas; item que não saiu entra como o original era).
442
+ - `src/import/merge.js`: juntar slides progressivos num que se monta por cliques (step/exit), sem IA.
443
+ - Modelos: papel `vision` no llm.js (chamada com imagem para o modelo de visão quando o de texto não enxerga).
444
+ modelrelay do sagadeck: text = deepseek/deepseek-v4-pro (escreve), vision = deepseek/deepseek-v4.1-flash (vê).
445
+ - O chat mostra o prompt dos slides importados resumido (`promptSpec`): o deck inteiro passaria de 300 mil tokens.
446
+ - Teste: `test/transform.test.js` (LLM falso roteado por etapa). Próximo: rodar os dois testes da Aula 1 de verdade,
447
+ com Pro e com Flash no texto, e comparar.
448
+
449
+ ## Estilo da pessoa (mestre) e revisão das mudanças — 30/09/2026
450
+
451
+ - `master:` no deck (src/master.js): moldura em todo slide (`elements`, `cover` para capa/seção/fim), área do conteúdo,
452
+ cara do título; `field: slidenum` numera. Slide `canvas` e `master: false` ficam sem.
453
+ - `styleFromImport`: a moldura é o que se repete na mesma posição (mesmo copiado slide a slide — a Aula 1 faz assim);
454
+ aulas misturam fontes, então vale o que aparece em ≥20% dos slides; título/corpo pelos placeholders ou, sem eles, a
455
+ maior fonte no terço de cima; tema com as cores e fontes do original. Importação passou a deduplicar mídias.
456
+ - Biblioteca: `.estilos/<id>/estilo.yaml` + imagens (`saveStyle`, `listStyles`, `applyStyleTo` copia para
457
+ `imagens/estilo/<id>/`). Studio: Design › Estilo (aplicar / salvar o desta / tirar).
458
+ - `review: { status: novo|alterado, note, original }`: selo na miniatura, faixa com Ver original (a foto de
459
+ `original/slide-NN.png`), Aceitar e Desfazer (volta de `original/original.yaml`), Revisar › Mudanças com a lista.
460
+ - Teste: `test/style.test.js`.
461
+
462
+ ## Importar PowerPoint fielmente (fase 1 do plano de importação) — 30/09/2026
463
+
464
+ - Casos reais (locais, fora do repositório): `Aula 1 - Conceitos Básico - 2026.pptx` (83 slides, 16:9, hidrologia,
465
+ ciclo desenhado com ~90 formas, texturas, tabelas, OLE, OMML) e `Intro01.pptx` (23 slides, 4:3, 4 mestres).
466
+ Comparados lado a lado com a foto do PowerPoint: praticamente iguais.
467
+ - `src/import/pptx.js` (leitor puro): herança slide > layout > mestre > txStyles > defaultTextStyle, tema por mestre,
468
+ cores com lumMod/tint/alpha, auto-ajuste (fontScale), marcadores (Wingdings/Symbol desenhados, inclusive dentro do
469
+ texto na faixa F0xx), formas prontas + desenho livre em SVG, texturas (blipFill em padrão) e hachuras, grupos
470
+ achatados, imagens com recorte e contorno, tabelas com estilo do arquivo ou embutido (Light/Medium Style), callouts,
471
+ gráficos simples, OLE (prévia), OMML → LaTeX (`src/import/omml.js`), anotações.
472
+ - `src/import/index.js`: grava mídias (WMF/EMF → PNG pelo Windows, `office.js`), cópia em `original/`, fotos do
473
+ original (PowerPoint numa cópia só leitura; ou LibreOffice → PDF → pdf.js, `pdf-render.js`) e recorta da foto o
474
+ que não sai igual (`crop.js`). `outlineOf` dá o roteiro para a IA.
475
+ - Entradas: `sagadeck importar arquivo.pptx`, Biblioteca › Importar apresentação (.pptx), `library.importOffice`.
476
+ - Elementos novos no motor: `textbox`, `table` (importada), `drawing`, `image.crop/flipH`.
477
+ - Teste: `test/import.test.js`. Próximo: estilo do usuário (mestre), marcas de mudança e os dois desafios da aula.
478
+
479
+ ## Arquivos do projeto como no VS Code: código com realce, CSV como o Excel, PDF e DOCX — 30/09/2026
480
+
481
+ - Pedido: ver e editar .txt/.md/.json/.yaml com realce; ver PDF; ler .docx (editar só formato nativo, sem pesar);
482
+ CSV igual ao Excel, descobrindo vírgula, ponto e vírgula ou tab.
483
+ - `src/csv.js`: separador descoberto pela consistência das colunas (e a linha `sep=` do Excel), aspas com
484
+ separador/quebra de linha, BOM e fim de linha preservados ao gravar. O motor (`parseTable`) usa o mesmo leitor.
485
+ - `src/studio/public/viewers.js`: editor com números de linha, Tab/Shift+Tab e realce (json, yaml, md, js/ts, py,
486
+ css, html/xml/svg, sql, sh, ini, csv com cada coluna de uma cor); grade tipo Excel (letras/números, editar
487
+ digitando, Enter/Tab/setas, colar bloco do Excel, Ctrl+Z/Y, menu de linhas/colunas) que grava em
488
+ `/api/project/sheet-write` no formato original; PDF pelo pdf.js servido em `/vendor/` (sem ele, o leitor do
489
+ navegador); DOCX convertido pelo servidor (`src/docx.js`: títulos, listas, negrito, links, tabelas, imagens).
490
+ - Teste: `test/viewers.test.js`.
491
+
492
+ ## Algoritmo rastreado genérico: qualquer código, como num depurador — 30/09/2026
493
+
494
+ - Pedido: além dos clássicos, mostrar um algoritmo qualquer (o que o professor inventou, árvore, grafo) com o
495
+ "inspect" das variáveis. Decisão: um núcleo genérico (execução rastreada) + catálogo por área crescendo em cima.
496
+ - `src/pytrace.js`: Python simples interpretado em JS, sem eval (def/recursão, class, if/while/for, listas,
497
+ tuplas, dict, set, fatias, compreensões, lambda, f-string, deque, heapq, math). Grava cada passo: linha, variáveis
498
+ de cada chamada, leituras/escritas por índice e atributo, comparações igual/diferente, print, expressões
499
+ observadas (`watch`). Comentário no fim da linha vira legenda (`{expr}` troca pelo valor); sem ele, a frase sai
500
+ com os valores (`v[j] > v[j + 1] → 5 > 3: sim.`), sem recalcular nada com efeito colateral.
501
+ - `src/trace-view.js`: desenho pelo tipo (barras, casas com ponteiros aprendidos, padrão alinhado sob o texto,
502
+ grade, tabela, grafo em camadas com visitados/fila/aresta da vez, árvore e lista ligada), código com a linha e
503
+ painel de variáveis por chamada (o que mudou acende). `view:` escolhe quando precisar.
504
+ - `src/algo-catalog.js`: naive, kmp, quicksearch (texto), bfs, dijkstra (grafos), bst (árvore). Algoritmo novo no
505
+ catálogo = mais um programa + a chamada com os dados do slide.
506
+ - Studio: o formulário do `algo` ganhou o catálogo e "Meu código (Python)" (programa + chamada).
507
+ - Teste: `test/trace.test.js` (interpretador, erros com linha, rastro, catálogo contra a busca ingênua em 40
508
+ textos, desenho de cada tipo, apresentação com Tocar, Studio gravando o programa).
509
+
510
+ ## Proporção do slide: 16:9, 4:3, retrato e qualquer L:A — 30/09/2026
511
+
512
+ - `deck.aspect` (src/aspect.js): largura lógica fixa em 1920 e a altura acompanha (4:3 → 1440; 9:16 → 3413).
513
+ CSS usa `--sh`/`--aspect` (no `<html>` da apresentação e no Studio); runtime, desenho, fotos, PDF (página do
514
+ tamanho do slide) e PPTX (layout próprio, 13,333 pol de largura) leem o tamanho do deck.
515
+ - Trocar a proporção (Propriedades › Apresentação, com "Personalizada…") passa por `convertAspect`: o layout `canvas`
516
+ (y, h) e os deslocamentos do Studio (`visualEdits.dy`) são reescalados; o resto se ajusta sozinho.
517
+ - Retrato (`data-orient="portrait"`): o que era lado a lado vira pilha; grades com poucos itens ampliadas.
518
+ - Próximo: etapa 1 do plano de importar PPTX/PDF (leitura fiel + foto pelo PowerPoint / leitor de PDF do Windows).
519
+
520
+ ## Aula: exercício resolvido, calculadora ao vivo, algoritmo animado; demos de hidráulica e algoritmos — 30/09/2026
521
+
522
+ - Exercício da pessoa: professor de hidráulica (Navier–Stokes, laminar → turbulento) e de computação (ordenação e
523
+ busca). O que já dava: equações, curvas com controles, comparação, código guiado, gráfico de complexidade. O que
524
+ frustraria: resolver o exercício passo a passo, uma calculadora para a turma mexer e ver o algoritmo rodando.
525
+ - `solution` (src/lessons.js): enunciado + dados + "pede-se"; um passo da conta por clique (os anteriores compactos,
526
+ a lista ancorada embaixo); resposta em destaque. Dado numérico vira LaTeX com vírgula decimal, milhar e 10 elevado.
527
+ - `calc` (src/lessons.js + src/runtime/calc.js, a mesma conta no motor e na apresentação): entradas com controle,
528
+ saídas por fórmula (nomes longos como `nu`, `eps` valem), `cases` por faixa (texto, cor e fórmula por faixa) e
529
+ régua (`scale`, log). Bug de caminho: rótulos da régua eram `.t` e se encostavam; o ajuste encolhia o slide a 61%.
530
+ - `algo` (src/algo-trace.js): o motor roda bubble/insertion/selection/merge/quick e busca linear/binária e grava os
531
+ passos (comparar, trocar, escrever, pivô, faixa, achou) + pseudocódigo com a linha da vez + contadores. Botão
532
+ Tocar genérico no runtime (`[data-autoplay]`).
533
+ - Fórmulas: `plot.xlog`/`ylog` (amostragem e eixos log; diagrama de Moody). Os títulos de eixo do deck não apagam
534
+ mais o tipo/faixa do eixo.
535
+ - Limite de palavras próprio: solution 140, calc 90, algo 60. Galeria: "Aula: exercícios e algoritmos".
536
+ - Demos "Aula de hidráulica" e "Aula de algoritmos"; cada demo da vitrine com tema, tom e figura de capa próprios
537
+ (antes todas iguais). Barra da esquerda abre sempre nos slides.
538
+ - Teste ao vivo: pedindo as duas aulas ao modelo, ele usou `solution`, `calc` e `algo` sozinho.
539
+
540
+ ## Painel, menus de botão direito, "Deixar assim" que dura, dois usos do material — 30/09/2026
541
+
542
+ - "Deixar assim" grava `fiscalOk` (impressão digital do conteúdo do slide) no deck: sem aviso, contador nem
543
+ marcação até o slide mudar, inclusive depois de recarregar.
544
+ - `purpose` passa a ter dois usos na tela e na IA: `palestra` (para apresentar: letra grande, pouco texto) e
545
+ `consulta` (para estudar depois: conteúdo denso). aula/workshop/executiva de decks antigos continuam valendo.
546
+ - Painel direito abre no chat; fora dele, um atalho flutuante (direita, no meio) volta, com um ponto quando a IA
547
+ respondeu. `paneOnLoad` só existe para os testes antigos (que esperam o Formatar).
548
+ - Bug: trocar de slide com um objeto selecionado deixava o painel preso em Propriedades (sem os campos do carrossel,
549
+ do screenshot etc.). Seleção vazia por qualquer motivo volta ao Formatar; duplo clique fora do texto abre o
550
+ conteúdo; Propriedades tem "Editar o conteúdo do slide".
551
+ - Botão direito: no slide (conteúdo, IA, layout, arrumar, novo, duplicar, apresentar, excluir), no objeto
552
+ (propriedades, frente/trás, excluir) e na miniatura (mover, duplicar…). Escuta no documento pelo ponto do clique
553
+ (a pílula de texto flutua por cima e o editor redesenha ao apertar).
554
+ - Árvore no estilo VS Code: renomear e criar no próprio item (sem prompt), ações ao passar o mouse, setas/Enter/
555
+ F2/Delete, apagar sem pergunta (lixeira do projeto + Desfazer), menu com copiar caminho e enviar para cá.
556
+ - Carrossel em roda com fotos maiores (300 px; a ativa 1,8×); a IA pode gerar as fotos (`image_prompt` por item).
557
+ - Bug achado nos testes: o observador do selo do chat mexia na própria classe e travava a página em laço.
558
+
559
+ ## Projeto no estilo VS Code, planilhas estilo JMP, esvaziar lixeira, demo de novidades — 30/09/2026
560
+
561
+ - Projeto = a pasta do deck (`src/studio/project.js`): `<nome>.yaml`, `imagens/`, `contexto/` (anexos, prints,
562
+ planilhas, `.md`) e `.sagadeck/` (conversa.json, cache/, lixeira/). `.sagadeck` e o `.yaml` são protegidos
563
+ (não se apagam nem renomeiam pelo Studio); caminho fora da pasta é recusado; apagar vai para
564
+ `.sagadeck/lixeira` com Desfazer. Deck solto numa pasta com outros decks não vira projeto. A conversa passou de
565
+ `<deck>.conversa.json` para `.sagadeck/conversa.json` (migra sozinha). O pacote `.sagadeck` continua levando só o
566
+ que o deck usa.
567
+ - Studio: barra da esquerda alterna Slides | Arquivos (árvore com criar, renomear F2, apagar Delete, enviar,
568
+ arrastar para mover/enviar). Abas no centro: Apresentação fixa; o `.yaml` abre com o slide ao lado e atualiza
569
+ enquanto digita; `.md` com prévia; imagem com "Usar num slide". Ctrl+V de print: na aba Arquivos só guarda em
570
+ `contexto/`; nos Slides abre o editor de screenshot e também guarda. Anexo do chat também vai para `contexto/`.
571
+ O texto de `contexto/` (md, csv, xlsx, pdf, docx…) vai para a IA como material (cache em `.sagadeck/cache`).
572
+ - Planilha (CSV/TSV/XLSX, várias abas, sem biblioteca: o xlsx é lido como zip): grade com o tipo de cada coluna
573
+ (tempo, número, porcentagem, categoria, texto) e sugestões com prévia (linha no tempo, barras ordenadas, rosca
574
+ de partes, colunas agrupadas, dispersão). "Sugerir com IA": o modelo recebe só o resumo das colunas, corrige tipos
575
+ e escolhe gráficos, títulos e eixos. "Inserir no slide" grava `from:`; "Atualizar da planilha" relê o arquivo.
576
+ Gráficos ganharam `xLabel`/`yLabel`; números de planilha entendem `40%` e `R$ 1.234,5`.
577
+ - Biblioteca: "Esvaziar lixeira" (com confirmação). Vitrine: "Novidades" (`model-novidades`), um slide de cada
578
+ recurso novo; a cópia traz `contexto/vendas.csv` e `contexto/leia-me.md`.
579
+
580
+ ## Zoom lento no foco e animações menos secas — 30/09/2026
581
+
582
+ - Spotlight: `zoom: true` (slide) ou `zoom: N` / `false` (foco). Camada `.spotlight-zoom` com imagem + regiões; o
583
+ runtime (`zoomSpotlight`) centraliza o foco sem mostrar fundo vazio, 1,8 s com aceleração suave; a borda do
584
+ destaque não engorda. PDF/export e "sem animação" ficam na imagem inteira.
585
+ - Modo padrão (subtle) era só fade de 0,38 s e passos de 0,25 s sem movimento ("seco"). Agora: entrada sobe 14 px
586
+ com o desfoque sumindo (0,85 s, escalonado), cliques com o mesmo movimento, troca de slide com fade de 0,6 s e
587
+ assentamento de escala, painéis de etapa suaves. Export sem transformações.
588
+
589
+ ## Carrossel em semicírculo e em anéis — 30/09/2026
590
+
591
+ - `carousel` (`src/carousel.js`): um item por clique com foto e texto. `arc`: roda com o centro fora do slide gira até
592
+ o item (que cresce); o texto sai pela esquerda e o novo entra da esquerda, sobrepondo. `rings`: a foto em anel
593
+ externo (anti-horário) e disco interno (horário) que travam formando a foto; o texto sobe junto.
594
+ - Runtime: `renderLesson` põe `--lesson-i` no slide e `active`/`past` em `[data-lesson-k]` (genérico).
595
+ - Sem foto: paisagens desenhadas em SVG (offline). Foto da pessoa: `image:` ou Escolher foto no Formatar.
596
+
597
+ ## Dinâmicas a dois: duelo de commits, dois terminais, turnos — 30/09/2026
598
+
599
+ - Pedido da pessoa (brainstorm de dinâmicas para aula de Git; a ideia 2, QR ao vivo, ficou de fora).
600
+ - `src/dynamics/git-sim.js`: simulador (duas pessoas + origin/main + um arquivo). O slide só diz o que cada um faz;
601
+ ele calcula push recusado, fast-forward, merge automático, conflito (merge a três por linha, com marcadores),
602
+ commit de dois pais, `git log --graph` e o grafo em SVG. Linhas mudadas no turno por LCS.
603
+ - `duel`, `terminals`, `turns` (`src/dynamics/layouts.js`): um quadro por clique (data-lesson). Aposta
604
+ (`bet:`) vira enquete antes do primeiro pull que decide; o quadro seguinte carimba "Deu conflito!". Terminal digita
605
+ o comando. Galeria: categoria "Dinâmicas a dois". Formulário com "Linhas que muda" (2: texto).
606
+
607
+ ## Criar com IA = o mesmo caminho do chat — 30/09/2026
608
+
609
+ - "Criar com IA" / "Deck com IA" saíam bem piores que pedir a mesma coisa no chat (teste da pessoa: "apresentação
610
+ bem humorada de como fritar um ovo como um chef"). A geração tinha caminho próprio: direção criativa sorteada,
611
+ regras rígidas de ritmo, temperatura 0,7, rodadas de enxugamento e de variedade, `autofixDeck` por cima.
612
+ - Agora `generateDeck` chama `editDeck` sobre um deck em branco (as mesmas regras, a mesma temperatura, uma chamada).
613
+ Ficam: pergunta de propósito (Preferências), autor, idioma, data, imagens (geradas depois), estilo escolhido e
614
+ materiais. Se a IA preferir perguntar, a pergunta volta com as opções.
615
+ - Bug achado no teste ao vivo (vale para o chat também): `{ text: Manteiga, mas sem fumaça }` partia o texto na
616
+ vírgula; chave com espaço e valor vazio volta a ser o fim do texto anterior (`rejoinFlowCommas`).
617
+
618
+ ## Gráficos de verdade: fórmula livre, planilha que cola do Excel, CSV — 30/09/2026
619
+
620
+ - A pessoa reclamou (com razão) que o brainstorm dos gráficos ficou no papel e que o slide científico só plotava duas
621
+ curvas prontas; e que até elas sumiam (a galeria e as miniaturas não montam o Plotly: o quadro ficava vazio).
622
+ - **Fórmulas e funções** (`science`, novo nome): `plot.functions` com a fórmula em texto (`a*sin(b*x)`, `x² - 2x + 1`,
623
+ `h0 - g*x^2/2`). Compilador próprio em `src/runtime/formula.js` (sem eval; tabelas sem protótipo; roda na
624
+ apresentação e no Node). Letra que não é x vira **controle deslizante** que redesenha a curva ao vivo
625
+ (`plot.params` dá valor, limites e nome). `plot.points` (colado do Excel, CSV em texto ou arquivo ao lado do deck),
626
+ `plot.surface` (z = f(x, y)). O slide traz uma **prévia desenhada** em SVG (miniatura, galeria, PDF); o Plotly
627
+ entra por cima. Fórmula com erro: o gráfico diz o erro e o fiscal recebe o aviso. `preset` antigo vira fórmula.
628
+ - **Gráfico de dados** (`chart`, novo nome): planilha no Formatar (Rótulo + uma coluna por série); Ctrl+V do Excel em
629
+ qualquer célula preenche a partir dela, primeira linha com texto vira nome de série; número brasileiro (1.234,5);
630
+ Importar CSV. Várias séries em barras/colunas = **agrupadas** com legenda (nativo no PPTX). `csv: dados/x.csv`
631
+ lê o arquivo ao lado do deck.
632
+ - Falta do brainstorm: gráfico sugerido pela IA a partir de tabela colada no chat (hoje o chat já monta `chart`, mas
633
+ sem sugestão de tipo com prévia).
634
+
635
+ ## Miniaturas inteiras, Arrumar layout único, abas do painel — 29/09/2026
636
+
637
+ - Miniaturas do trilho cortavam o slide: a escala era fixa (0,09 = 173 px) num quadro de 156 px. Agora um
638
+ `ResizeObserver` põe `--thumb-scale` pela largura do quadro.
639
+ - Revisar: "Corrigir layout" e "Arrumar" eram o mesmo `triggerAutofix` (o Arrumar só somava uma animação e um aviso
640
+ que prometia alinhar). Ficou um botão, **Arrumar layout**, que diz o que fez, tem Desfazer e avisa quando não há
641
+ nada a arrumar.
642
+ - Abas do painel lateral: a aberta mostra o nome, as outras só o ícone (as quatro cabem). Avançado é a última aba da
643
+ faixa; os grupos de especialista do Início vêm logo depois dos outros (não vão mais para a outra ponta).
644
+ - Variáveis: grade ocupando a aba, sem texto de manual, coluna **Tipo** (Normal/Segredo) que move a variável entre
645
+ `vars:` e `secrets:`.
646
+
647
+ ## Fase 3 do SagaStudio: inspetor de propriedades — 29/09/2026
648
+
649
+ - `src/studio/public/inspector.js` (aba **Propriedades**): grade compacta com categorias recolhíveis (lembradas no
650
+ navegador). Objeto: só o que faz sentido (texto, forma desenhada ou reta, imagem); vários selecionados mostram o
651
+ valor comum ou "vários" e a edição vale para todos. Slide e Apresentação sempre (layout, tom, textura, densidade,
652
+ tempo, transição, limite de palavras, rodapé, tema/paleta só do slide, fundo; purpose, tema, paleta, destaque,
653
+ animações, duração, autor, data, `fit`). Cada linha alterada tem "voltar ao padrão". Selecionar um objeto com o
654
+ painel em Formatar leva para Propriedades (como no Figma).
655
+ - Motor (`src/visual-edits.js`): novas chaves de `visualEdits` (peso, itálico, alinhamento, entrelinha, espaçamento,
656
+ maiúsculas, rotação, opacidade, sombra, cantos, contorno, `step`, `anim`), só valores de lista ou números. Formas
657
+ desenhadas leem `--shape-fill/--shape-stroke/--shape-sw`.
658
+ - Editor visual: `SagaVisual.selection/edits/setProp/clearEdits/onSelect/select` para o inspetor (com Desfazer).
659
+ - Bug: painel de avisos do fiscal e menu dos temas usavam `var(--panel, #fff)` (variável inexistente): fundo branco
660
+ com texto claro no tema escuro. Agora `var(--chrome)`; teste de contraste no tema escuro.
661
+
662
+ ## Fase 2 do SagaStudio: a IA sabe para que serve o material — 29/09/2026
663
+
664
+ - Causa do "material de consulta que saiu palestra": o prompt de geração era só de palestra ("pouco texto, detalhe
665
+ em notes, interação, slides de impacto"), a rodada de enxugar cortava para 75% de 40 palavras, a de variedade
666
+ trocava explicação por slide de impacto e a auto-correção movia o corpo para as notas acima do limite.
667
+ - `purpose` no deck (`src/purpose.js`): consulta 220 palavras, aula 160, workshop 110, palestra/executiva 40; motor,
668
+ auto-correção, IA e Studio usam `wordLimit`. Consulta/aula: explicação no slide, sem quiz/seção vazia/número de
669
+ impacto, sem a rodada de variedade; notes curtas.
670
+ - Decisão pelo modelo (regra do projeto): com Preferências › perguntar ligado, `decidePurpose` faz uma chamada curta
671
+ (JSON) antes de gerar; no pedido longo o modelo tendia a supor. Ambíguo (workshop sem dizer se fica com o pessoal):
672
+ devolve pergunta com opções; biblioteca e "Deck com IA" mostram e geram de novo com a resposta. Quantidade de texto
673
+ dita com todas as letras vence o tipo (grava `maxWords`) e não pergunta. Testes ao vivo em `ai-live.test.js`.
674
+ - Contra invenção: nada de número/data/nome sem fonte; `date` = dia da criação; `author` das Preferências.
675
+ - Temas `manual` (claro) e `manual-noite` (escuro), com `pair`: Design › Versão clara/escura; PDF no claro
676
+ (Preferências › Exportação, `lightVariant`). Estilo "Documentação técnica" no Criar com IA. `gitGraph` na referência.
677
+ - IA › **Material de consulta**: pede ao assistente para reescrever o deck como material para distribuir.
678
+
679
+ ## Fase 1 do SagaStudio: código nunca cortado, fiscal, Preferências — 29/09/2026
680
+
681
+ - Achado do exercício (material de Git): o slide `code` usa o editor do codewalk, que tinha `overflow:auto` sem barra
682
+ à vista, e o PDF não rola: 18 de 28 linhas sumiam. Agora `fitCode` (`src/runtime/fit.js`) quebra linha longa,
683
+ encolhe até `fit.minCodePt` (pt; `data-min-code` no slide, em px) e, se nem assim couber, rola e marca
684
+ `data-code-cut`. O fiscal do Studio acusa ("Código não coube") e oferece **Dividir em dois slides** (destaques de
685
+ linha acompanham). A 10 pt cabem ~16 linhas num slide de código.
686
+ - Vazamento: cartões, itens da grade adaptável e código passam a contar em `leakingIn` e no fiscal (o slide de grade
687
+ invadia o rodapé sem aviso).
688
+ - Preferências (`src/preferences.js`, `~/.sagadeck/preferencias.json` ou `SAGADECK_PREFERENCIAS`; `/api/preferences`):
689
+ tela com busca, seções e gravação automática. Texto e código (mínimos em pt, quebrar linha) valem para o motor via
690
+ `setFitDefaults`; o deck (`fit:`) vence. Editor (tema da interface, guias, marcas do fiscal) neste navegador.
691
+ - Próximas fases: IA decide o tipo de material (e pergunta), temas técnicos claro/escuro, Object Inspector.
692
+
693
+ ## Marca, faixa sem "Mais opções", fonte que encolhia, grade de variáveis — 29/09/2026
694
+
695
+ - Marca: "CREATIVE STUDIO" e um logotipo com significado (um deck, dois slides, com o "apresentar" no da frente) na
696
+ biblioteca e no editor (antes: um "Z" e o ícone de camadas).
697
+ - Faixa: sem o botão "Mais opções" (modo simples saiu); tudo à vista, e os grupos `[data-adv]` ficam à direita da aba.
698
+ - Bug: tamanho escolhido num texto com ajuste para caber (`data-fit`, ex.: o "01" das coleções) era encolhido pelo
699
+ `fit.js` e o campo mostrava o valor encolhido. Agora `visualEdits.size` marca `data-vsize` e o ajuste pula.
700
+ - Bug: seletor com o padrão igual a uma opção ("Síncrono") aparecia duplicado; a opção passa a ser o padrão.
701
+ - Variáveis: grade no estilo Object Inspector (linha de 22 px, letra 12 px, célula = campo; grava ao sair/Enter, Esc
702
+ desfaz, última linha cria, lixeira na linha). Editar um ambiente de exemplo (ENSAIO) cria a cópia dele no arquivo
703
+ (`adopt` em `src/api-client.js`), em vez de recusar.
704
+
705
+ ## Objetos: cor, preenchimento, "Enviar para trás"; vitrine clara; Criar com IA unificado — 29/09/2026
706
+
707
+ - Bug: "Atrás" mandava a forma para `z-index` negativo, atrás do fundo do slide (sumia e não dava para excluir). Agora
708
+ `.safe`/`.free` isolam o empilhamento (`isolation:isolate`) e o clique pega o objeto mais de cima naquele ponto
709
+ atravessando as caixas transparentes do layout (`objectAt` com `elementsFromPoint`); Tab/Shift+Tab passam de objeto.
710
+ - Bug: a cor só mexia no texto; formas ganharam **Preenchimento** (`visualEdits.fill`: `--shape-fill` nos desenhos SVG,
711
+ fundo nas formas retas). A barra do objeto flutua junto da seleção, em qualquer aba, com rótulos e ícones; a cor
712
+ muda ao vivo e grava ao soltar.
713
+ - Vitrine Modelo pronto: capa desenhada de verdade (`/api/library/gallery-cover`, cache em `.cache/vitrine`), dois
714
+ grupos pelo uso ("Visuais para começar", "Recursos do SagaDeck"), sem nome repetido (o estilo "Essencial" virou
715
+ "Uma ideia por vez"). Estilos e exemplos também abrem em prévia (`galleryEntry` no servidor, chave `exp-*`/`example-*`).
716
+ - Nova: "Descrever com IA" e "A partir de um arquivo ou link" viraram **Criar com IA**; o modal abre primeiro (sem
717
+ abrir o seletor de arquivo) e aceita arrastar arquivos.
718
+
719
+ ## Modelos abrem em prévia (cópia só na primeira mudança) e limpeza da biblioteca — 29/09/2026
720
+
721
+ - Decisão: modelo/demo de fábrica é **vitrine**, não arquivo. `Modelo pronto` abre `editor?model=<tipo>&topic=…`
722
+ (`/api/library/decks/model-preview`): o deck vive só na memória do Studio (`W.preview`, `W.file = null`), com as
723
+ imagens lidas de `src/studio/assets/imagens/` (movidas para lá). A primeira mudança que chega em `/api/deck` (ou
724
+ `/api/library/decks/model-use`, botão **Usar como base**, ou a IA indo gravar imagens) cria a cópia no tópico de
725
+ origem (padrão `Modelos`) com as imagens; a URL vira `?deck=<id>`. Abrir, navegar e apresentar não gravam nada.
726
+ - "Abrir demos completos" (Avançado) abre `biblioteca?galeria=demo`, a vitrine filtrada nas demonstrações.
727
+ - Limpeza: as cópias sem edição (iguais ao modelo de fábrica) foram para a Lixeira; as editadas ficaram.
728
+ - Testes: `studio.test.js` (prévia sem arquivo e com imagem; primeira edição cria a cópia com a imagem; o modelo
729
+ continua igual; Usar como base; coleções via prévia; demo avançado e `?galeria=demo`).
730
+
731
+ ## Seleção de objetos, IA local, Novo slide único e Animações — 29/09/2026
732
+
733
+ - Seleção como no Google Slides/Canva (`visual-editor.js`): um clique em qualquer ponto do objeto seleciona (texto
734
+ também); clicar de novo no texto selecionado ou duplo clique escreve; retângulo numa área vazia seleciona vários
735
+ (o de fora ganha do de dentro); Shift+clique soma; arrastar, setas, Delete e a barra valem para todos. Bug que
736
+ motivou: caixa de texto livre movida não se deixava selecionar (o clique virava escrita). O retângulo converte a
737
+ escala do palco (zoom).
738
+ - IA: o `sagadeck studio` em Node sobe o `modelrelay serve` junto (`src/ai/relay.js`), como o sagadeck do pip; nada
739
+ sobe com `SAGADECK_LLM_URL`, `SAGADECK_NO_RELAY=1`, `--multiuser` ou alguém já na 8765. Nesta máquina o modelrelay
740
+ não estava instalado: instalado editável do clone (0.2.0). Teste: `relay-autostart.test.js` (spawn falso).
741
+ - "Novo slide" só no Início, botão dividido (em cima: em branco; embaixo: galeria de tipos); saiu do Inserir.
742
+ - Essencial/Equilibrado/Palco saiu do topo: menu **Apresentar ▾ › Animações** (Sem animação, Suaves, Expressivas).
743
+
744
+ ## Novo slide × Layout × Inserir, formas, faixas do Design — 29/09/2026
745
+
746
+ - Decisão: **uma galeria só para criar slide** (a antiga "Modelos", agora "Escolher tipo" no Início e "Novo slide" no
747
+ Inserir), com os 44 tipos em 9 categorias (`SLIDE_GROUPS` em `app.js`) e busca sem acento; Enter insere o primeiro.
748
+ **Layout** troca o formato do slide atual e usa as mesmas categorias. **Inserir** ficou só com o que entra no slide
749
+ atual (Texto, Formas, Imagem, Ícone, Diagrama de texto); os botões de tipo de slide e os atalhos do Avançado saíram.
750
+ - Formas: menu com 12 desenhos. O motor ganhou triângulo, losango, hexágono, estrela, seta, chevron e balão
751
+ (SVG com preenchimento e contorno, `bg` vira o preenchimento). "Desfazer objeto" saiu: Delete exclui, Ctrl+Z desfaz.
752
+ - Design: faixas de tema e paleta só com cartões inteiros e sem barra de rolagem; setas passam de página e "Ver
753
+ todos" abre a mesma galeria em grade (mesmos cartões: prévia no hover, clique, botão direito). A 1366 px cabem 3.
754
+ - Botão de tema claro/escuro do editor foi para o canto direito do topo, como na biblioteca.
755
+ - Testes: `engine.test.js` (formas), `studio.test.js` (galeria, busca, categorias, Status semanal pela galeria, menu
756
+ de formas + Delete, faixas do Design, posição do botão de tema); helper `novoSlide(p, tipo)` em `helpers.js`.
757
+
758
+ ## Variáveis em tabela, ambientes protegidos e ajustes do editor — 29/09/2026
759
+
760
+ - Aba **Variáveis**: tabela Nome / Valor do ambiente atual, editável na linha (nome sem `{{}}`); arrastar o nome
761
+ para um campo do slide escreve `{{nome}}`. Sem botão Inserir. Segredos só pelo nome; valor com cara de token é mascarado.
762
+ - **Ambientes** (slides de API): modal maior; o YAML é validado a cada digitação (`POST /api/http/ambientes/validar`,
763
+ mesma regra do salvar, inclusive `secrets` e `current`); **Salvar** só habilita com YAML válido e a versão anterior
764
+ fica em `ambientes.yaml.bak` (0600).
765
+ - Texto / Forma / Imagem foram para **Inserir → Objetos livres**, sem o botão "Selecionar objetos" nem instrução
766
+ escrita: clicar num objeto do slide já seleciona. Miniaturas do "Diagrama de texto" com o dobro do tamanho.
767
+ Botão Apresentar e o menu dele com 40 px de altura. Elemento `{ image: "" }` não quebra mais o render.
768
+ - Prévia de tema no hover: a da main (`previewLook`, tema e paleta) ficou; a versão paralela da Frente D saiu
769
+ (a main já testa em `studio-themes.test.js`).
770
+ - Achados no merge, com teste: (1) escolher um ambiente gravava `current:` no arquivo mas a caixa de texto ficava
771
+ com o antigo, e o Salvar seguinte desfazia a escolha; agora o texto acompanha (com edição pendente, só a linha
772
+ `current:` muda). (2) A caixa do aviso "texto pequeno" bloqueava o clique para editar o texto (agora deixa passar).
773
+ (3) Clique simples no texto voltou a escrever (barra de formatação); apertar e arrastar move o objeto; clique em
774
+ forma/imagem seleciona. Sair com Escape religa a edição dos textos.
775
+
776
+ ## Guia Avançado e demonstrações visíveis — 28/09/2026
777
+
778
+ - A aba **Avançado** do editor reúne o seletor de densidade do slide, inserção de página de consulta e atalhos
779
+ para grade adaptável, diagrama vivo e tipografia cinética. A seleção compacta o slide atual sem remover texto.
780
+ - A galeria **Exemplos do SagaDeck** também inclui página de consulta, grade adaptável, cápsulas e tipografia
781
+ cinética; são cenas inseridas no deck em edição, não apresentações completas.
782
+ - Biblioteca: **Abrir demos completos** leva ao tópico `Demos e modelos`; incluído `Recursos avançados` em **Modelo pronto**
783
+ para mostrar texto denso, blocos de código, aviso, grade, diagrama e sequência cinética no deck inteiro.
784
+ - Testes verificam seleção/persistência de densidade, inserção de página de consulta e renderização do demo.
785
+
786
+ ## Aviso de modelrelay velho sabe da instalação editável — 28/09/2026
787
+
788
+ - Pergunta do Naruminho: no laptop o modelrelay roda do clone; precisa `pip install -U`? Não: com `pip install -e`
789
+ o `git pull` basta (o sagadeck lê `modelrelay.__version__` do próprio código). O aviso mandava `pip install -U`
790
+ para todo mundo; agora `relay_clone()` (`python/sagadeck/llm.py`) vê se o pacote vem de uma pasta com `.git` e
791
+ `pyproject.toml` (fora de site-packages) e manda `git pull` naquela pasta. Teste em `python-relay.test.js`
792
+ (clone falso com `.git`; `.venv` dentro de repositório não conta como clone). README explica.
793
+
794
+ ## Frente F: fontes embutidas (sem Google) e modo simples no Studio — 28/09/2026
795
+
796
+ - **Fontes**: o `base.css` importava 6 famílias de `fonts.googleapis.com`. Na rede do banco (proxy barrando o Google)
797
+ o tema perdia a letra, abrir/exportar podia esperar a fonte e cada abertura avisava o Google. Agora as fontes (OFL,
798
+ pacotes `@fontsource` em devDependencies) ficam em `src/runtime/fonts/<família>.css` em base64, só o subconjunto
799
+ latino (`scripts/vendor-fonts.mjs` gera; `index.json` lista). O HTML leva só as famílias que o CSS do deck cita
800
+ (`fontsCSSFor` em `build.js`: um deck do sinal não leva a letra do rabisco); o Studio carrega todas uma vez em
801
+ `/fonts.css`. Licenças no `THIRD_PARTY_NOTICES.md`. Efeito colateral bom: os testes de UI da nuvem pararam de
802
+ falhar por "fonte do Google barrada".
803
+ - **Modo simples** (padrão): as ferramentas de especialista (`[data-adv]` no `index.html`: Abrir YAML, tom e textura,
804
+ API ao vivo, Última fileira/Mapa de atenção, Ritmo, Guias, YAML, Sons) ficam guardadas; "Mais opções" (à direita
805
+ das abas) mostra tudo e o navegador lembra (`simpleMode`). Nada foi removido.
806
+ - Testes: `fonts.test.js` (nenhum tema pede fonte à internet; deck leva só as suas; com a internet cortada o rabisco
807
+ desenha com Caveat; Studio serve `/fonts.css`), `studio.test.js` (modo simples esconde, Mais opções mostra e lembra).
808
+
809
+ ## Frente E (preguiçoso): Nova em 3 caminhos, vitrine única, prévia do tema e "Baixar tudo" — 28/09/2026
810
+
811
+ - **Nova (biblioteca)**: o menu tinha 16 entradas. Agora: *Descrever com IA*, *A partir de um arquivo ou link*,
812
+ *Modelo pronto*, e embaixo *Em branco* / *Importar*. `startNew()` em `library.js` é a porta única.
813
+ - **Vitrine "Modelo pronto"** (`galleryDialog`): coleções, estilos prontos (as experiências de
814
+ `src/experiences.js`, que antes não tinham porta: o "Escolher um estilo" abria o seletor de importar), demonstrações
815
+ e exemplos, com filtro. Mesmos `data-new` de antes (`model-*`, `example-*`) e `exp-<id>` para os estilos.
816
+ - **Diálogo de IA da biblioteca** (era só um campo de texto; a Frente A tinha melhorado só o modal do editor): assunto,
817
+ minutos (mostra "≈ N slides", mesma conta de `slidesForMinutes`), estilo (Automático = a IA escolhe o tema pelo
818
+ assunto, ou uma coleção) e material de apoio (arquivos e link, via `/api/ai/context`). "A partir de um arquivo" é o
819
+ mesmo diálogo, que já abre o seletor de arquivo e aceita gerar só com o anexo.
820
+ - **Bug**: "Deck com IA" do editor gravava o deck gerado solto na pasta do deck aberto (ou na pasta atual do servidor),
821
+ fora da biblioteca. Agora editor e biblioteca usam `generateIntoLibrary()` (pasta própria, no tópico do deck aberto;
822
+ falhou, vai para a lixeira). Teste em `storage.test.js` (falhava antes: o deck ia para `/tmp`).
823
+ - **Prévia do tema/paleta ao passar o mouse** (aba Design): o slide aberto aparece com o visual, com o selo
824
+ "Prévia: … Clique para aplicar."; nada é gravado; tirar o mouse volta; o clique aplica (`previewLook`/`endPreview`
825
+ em `app.js`, CSS da prévia numa `<style>` à parte).
826
+ - **Baixar tudo** (Arquivo, primeiro item): um .zip com o PowerPoint (com notas), o PDF e o roteiro
827
+ (`/api/export/tudo`; também na biblioteca por `kind=tudo`).
828
+ - Ícones `link` e `paperclip` incluídos (o chip de link do chat, da Frente B, aparecia sem ícone).
829
+ - Testes: `library-ui.test.js` (3 caminhos, vitrine com filtro, estilo pronto vira deck, IA manda minutos/estilo/anexo,
830
+ "a partir de um arquivo" só com o anexo), `studio-themes.test.js` (prévia sem gravar, clique aplica),
831
+ `studio.test.js` (Baixar tudo: zip com pptx com notas, pdf e roteiro), `storage.test.js` (gerado na biblioteca).
832
+
833
+ Falta da lista: modo simples por padrão (avançado dobrável) e as fontes do Google embutidas (a rede do banco barra
834
+ `fonts.googleapis.com`: temas perdem a letra, abrir/exportar pode esperar, e cada abertura avisa o Google).
835
+
836
+ ## Frente D (preguiçoso): trocar o tema muda o arranjo dos slides de conteúdo — 28/09/2026
837
+
838
+ - Antes a pele de cada tema (`src/runtime/skins/<tema>.css`) só rearrumava capa, seção e encerramento; no resto a
839
+ troca era cor e fonte. Agora cada tema tem o seu jeito para título (`.hd`), cartões e KPIs, marcador da lista,
840
+ citação, número grande e frase: barra de aviso e placas (sinal), fios e centralizado (editorial), vazado e
841
+ simétrico (noite), faixas primárias e círculos (bauhaus), prompt e janelinhas (terminal), fios duplos e colunas
842
+ (jornal), balões e sombra suave (oceano), contorno grosso e sombra dura (pop), centralizado sem caixa (prata),
843
+ tracejado e circulado à mão (rabisco), vidro e brilho (aurora). Só CSS (vale no HTML, PDF e PPTX pela coleta),
844
+ zero token, a geometria do YAML não muda.
845
+ - Bug achado no caminho (`src/runtime/fit.js`): elemento escondido (`display:none`, ex.: a aspas que o tema esconde)
846
+ contava como "texto fora da área" e o ajuste encolhia a citação até o mínimo.
847
+ - Mermaid na troca de tema: conferido que é só repintura no navegador (`paint()` com a paleta), sem IA. Nada a fazer.
848
+ - Teste: `themes-skin.test.js` monta 6 slides de conteúdo nos 11 temas e exige ao menos 8 arranjos diferentes por
849
+ tipo (ignorando cor, fonte e raio), nada fora do slide, nada vazando e texto curto sem encolher. REFERENCIA.md
850
+ descreve o que cada tema faz (a IA não reescreve slides só para "combinar").
851
+ - Frentes A, B e C (abaixo) foram feitas por outro agente (opencode); a suíte na `main` foi conferida antes: só as
852
+ falhas de ambiente da nuvem (fontes do Google barradas, nome do download no Chrome headless).
853
+
854
+ Próximas (mesma lista do "preguiçoso"): prévia do tema ao passar o mouse; "Baixar tudo" (PPTX + PDF + roteiro);
855
+ menu Nova com 3 caminhos e vitrine única de modelos; modo simples por padrão (avançado dobrável); estilo escolhido
856
+ pela IA pelo briefing quando a pessoa não escolhe.
857
+
858
+ ## Frente C (preguiçoso): elemento aviso: + regras de prompt + auditoria da referência — 28/09/2026
859
+
860
+ - Elemento novo `{ aviso: { tipo, titulo, texto } }` (tipos: importante/atencao/dica/perigo; atalho `{ aviso: "texto" }`
861
+ vira dica; "atenção" com ou sem acento): caixa com ícone e cor do tema em `src/elements.js` + CSS em
862
+ `src/runtime/base.css` (o PPTX/PDF herdam pela coleta do HTML). Formulário ganha o tipo "Aviso" (com
863
+ `f.obj` aninhado) e a ordem de tipos.
864
+ - Prompt (vale para chat e geração): slide denso fecha com 1 takeaway em ==destaque== e usa `aviso` para o que
865
+ não pode passar batido; ==palavras-chave== no texto em vez de negrito em excesso. REFERENCIA.md documenta
866
+ o elemento (vira chave válida) e os materiais da Frente B.
867
+ - Auditoria da preocupação "o chat conhece as ferramentas?": todos os 38 layouts são citados na referência,
868
+ cenas com exemplos, comandos via prompt do deck-ai. Buraco real era só o `aviso:` (agora documentado).
869
+ - Testes: `engine.test.js` (4 tipos, atalho, acento, tipo inválido, markdown e SVG), `studio.test.js` (adiciona
870
+ pelo formulário, salva no YAML, desenha a caixa), `ai.test.js` (regra no prompt do sistema). `npm run bundle` passou.
871
+ - Validação ao vivo (nemotron-3-ultra-550b:free; o 120b e o qwen gratuitos estavam sobrecarregados/limitados):
872
+ "adicione um aviso de perigo…" → `{aviso:{tipo:perigo,…}}` exato no slide.
873
+ - CI acusou 2 falhas no Linux (ambas verdes no Windows): (1) teste do Aviso não achava o campo visível —
874
+ blindado abrindo o cartão do elemento antes de digitar, como a pessoa faria; (2) conversa salva depois do
875
+ indicador sumir (race real: recarregar na mesma hora perdia a troca) — agora a conversa grava antes de
876
+ dispensar o indicador, nos 3 caminhos de resposta.
877
+
878
+ ## Frente B (preguiçoso): chat e Nova leem pdf/docx/xlsx/pptx e links — 28/09/2026
879
+
880
+ - Novo `src/ai/context.js`: extração de texto no servidor (txt/md/csv direto; docx/xlsx/pptx via jszip;
881
+ pdf via pdfjs-dist, dependência nova); links com anti-SSRF (sem rede local/metadata, redirects revalidados,
882
+ 2 MB, 15 s), HTML virando texto e PDF linkado valendo; bloco MATERIAL ANEXADO rotulado e truncado (12 mil
883
+ caracteres no prompt). O binário nunca vai para o modelo.
884
+ - `POST /api/ai/context` guarda o texto na sessão e devolve id; chat manda ids (imagens continuam embutidas);
885
+ links colados na mensagem são lidos sozinhos (até 2, falha não trava, aparece nas ações); `editDeck` e
886
+ `generateDeck` aceitam `materials`; modal "Deck com IA" tem anexos de arquivo + link.
887
+ - UI: chips de documento no chat e no modal, trava de envio enquanto lê, placeholders e accepts atualizados.
888
+ REFERENCIA.md documenta os materiais (vai no prompt da IA).
889
+ - Testes: `test/context.test.js` novo (extração, SSRF, fetch local, truncamento); `ai.test.js` (bloco no pedido);
890
+ `studio-ai.test.js` (docx anexado chega ao modelo sem o zip; link lido sozinho sem script); `studio.test.js`
891
+ (anexo no modal vai no corpo do pedido). `npm run bundle` passou (3,4 MB).
892
+ - Validação ao vivo (nemotron-3-super-120b:free, só texto): docx com "40 por cento / 3 bilhões" → slide editado
893
+ com os dois números em `==destaque==`. Na primeira tentativa o provedor gratuito devolveu 503 (sobrecarga);
894
+ passou na segunda.
895
+
896
+ ## Frente A (preguiçoso): Nova em 1 tela — minutos, estilo e placeholder — 28/09/2026
897
+
898
+ - Modal "Deck com IA" agora pede **minutos** (slides saem daqui: ~1 a cada 1,5 min, `slidesForMinutes()` em
899
+ `src/ai/deck-ai.js`; ajuste fino manual vale até trocar os minutos) e **estilo** (as 5 coleções →
900
+ `COLLECTION_STYLE` em `template-collections.js`: tema + direção criativa; tema explícito continua vencendo).
901
+ - Encanamento: modal manda `duration`+`style`, servidor repassa (`direction` resolvida no `generateDeck`);
902
+ sem minutos/slides, o servidor calcula os slides da duração (vale para o CLI `--duration`, que já existia).
903
+ - Ajuda do CLI menciona `--duration`. Placeholder do briefing com exemplo melhor.
904
+ - Testes: `ai.test.js` (regra, prompt com duration/style, precedência de explícitos), `template-collections.test.js`
905
+ (um estilo por coleção, tema válido), `studio.test.js` (modal: auto, sugestão de tema, corpo do pedido).
906
+ - Validação ao vivo (nemotron-3-super-120b:free, sem imagens): 10 min + estilo essencial → 7 slides variados,
907
+ tema prata, soma dos tempos = 10, em 1,6 min. `npm run bundle` passou.
908
+
909
+ ## Rótulos grudados na faixa de opções — 28/09/2026
910
+
911
+ - Reclamação: vários botões do editor com palavras grudadas ("Diagramade texto", "Cabeçalhoe rodapé",
912
+ "Deckcom IA", "Últimafileira", "Mapa deatenção").
913
+ - Causa: os rótulos usavam `<br>` para quebrar em duas linhas, mas o `studio-next.css` escondia o `<br>`
914
+ (`.studio-next .rbtn-lg br { display: none }`, do wip do visual novo) — as palavras colavam numa linha só.
915
+ - Correção: rótulos em linha única com espaço de verdade (`index.html`) e remoção da regra morta do CSS.
916
+ A faixa já rola na horizontal (`overflow-x`), então os botões mais largos não quebram nada.
917
+ - Não eram bug (só innerText de elemento escondido): selo "0" do fiscal (absoluto, some quando limpo),
918
+ "Aa+nome" dos cartões de tema (posicionamento absoluto) e título+descrição do menu Nova (descrição em bloco).
919
+ - Teste: `studio.test.js` abre cada aba (Inserir, Design, IA, Revisar) e confere o texto visível dos botões,
920
+ mais uma guarda contra minúscula seguida de maiúscula nos rótulos da faixa.
921
+ - Validação: `npm test` — 405 testes, 391 passaram, 14 pulados (ao vivo), zero falhas; `npm run bundle` passou.
922
+
923
+ ## Coleções visuais — 28/09/2026
924
+
925
+ - Pedido anterior interrompido após revisão e merge por Claude; nova frente limitada aos templates dos cinco
926
+ screenshots e à troca de imagens solicitada durante a execução. Nenhuma palestra pessoal reescrita.
927
+ - Cinco coleções em `src/studio/template-collections.js`: Perspectiva, Essencial, Revista, Cromático e Traços;
928
+ 31 slides editáveis, fotografias originais locais, capas, agendas, capítulos, colagens, encerramentos e
929
+ páginas adaptáveis. Menu Nova apresentação; cada cópia recebe seus recursos em `imagens/` na biblioteca.
930
+ - Formatar → imagem: escolher foto própria sem perder geometria; atalho que prepara no chat a geração pelo
931
+ conteúdo do slide; geração por descrição disponível também para substituir uma imagem existente.
932
+ - Testes: criação das cinco coleções pela UI com conferência de YAML/arquivos, substituição da foto com
933
+ preservação da geometria, pedido contextual no chat, renderização de todos os slides sem imagens faltantes,
934
+ formas transparentes por cores inválidas, texto fora do palco ou erros JS. Revisão visual dos 31 slides.
935
+ - Validação concluída: `npm test` — 404 testes, 390 passaram, 14 pulados, zero falhas; `npm run bundle` passou.
936
+ - Reinício local solicitado, mas o comando foi recusado pela revisão automática de permissões
937
+ (`blocked by policy`); não confirmado nesta etapa. O Studio permanece em `http://127.0.0.1:3001`.
938
+
939
+ ## Frente: diagramas, one-page e apresentações do dia a dia
940
+
941
+ Pedido original (Naruminho, set/2026), em cinco partes:
942
+
943
+ 1. **Diagramas de verdade**: setas (linha, pontilhada, grossa), fluxogramas, UML; menos rígido que os layouts;
944
+ a IA faz 95% e a pessoa só pede ajuste; foto de rascunho no guardanapo vira diagrama bonito.
945
+ 2. **One-page** (uma página só com tudo): jornada com ícones e mini-frases, problema com números, solução;
946
+ às vezes um dashboard (números grandes, mapa de região, barras comparativas, linhas de tendência).
947
+ 3. **Status semanal**: feito, bloqueios, problemas, avanço, screenshots quando há front-end; muito variável
948
+ (tem semana sem nada "mostrável").
949
+ 4. **Governança da Bridge**: pedido de acesso (SharePoint) → experimento (30 dias, prorrogável, dados
950
+ fictícios) ou projeto (DEV 30 dias, HOM 30 dias, PROD sem prazo); em HOM/PROD as chaves do Identity ficam
951
+ no Key Vault, cadastradas via RITM/Change no ServiceNow.
952
+ 5. **Caminhos que se abrem conforme o front-end**: lote (Databricks de madrugada, autocontido); front-end
953
+ próprio (Wave → arquitetura → infra → rede/firewall → infra de namespace/ARO → DBA do DER → DBA de
954
+ implantação → sistemas/devs, cada área com seu formulário/artefato: throughput, segurança, cyber,
955
+ sustentação com playbook/runbook, governança com descomissionamento/curadoria/data shift); Teams (curso e
956
+ licença Copilot Studio premium + Power Automate); SaaS externo (túnel mTLS + serviço extra na Bridge).
957
+ Pergunta: como deixar isso navegável, organizado e útil?
958
+
959
+ ### 1. Diagramas: FEITO (branch `claude/focused-albattani-vdll01`)
960
+
961
+ - Layout `diagram` com código Mermaid (`mermaid:`), desenhado no navegador por `src/runtime/diagram.js`
962
+ com a fonte e a paleta do slide. Biblioteca embutida (`src/runtime/vendor/mermaid.min.js`, via
963
+ `scripts/vendor-science.mjs`), funciona offline.
964
+ - Ênfase por classe (`:::hi`, `:::em`, `:::escuro`, `:::suave`, `:::vazado`); ícones `:nome:` nos rótulos
965
+ (o espaço do ícone é medido como texto "MM" antes do desenho e trocado depois: o nó não corta o rótulo).
966
+ - `%%{init}%%` é removido (fugiria da paleta).
967
+ - Visual (pedido de Naruminho, com um diagrama de arquitetura estilo draw.io como referência): famílias de cor
968
+ tiradas do tema, uma por grupo (`subgraph`): fundo bem claro, título colorido, nós com preenchimento suave e
969
+ contorno da mesma cor mais escura; setas em ângulo reto (`curve: step`); nada de preto chapado (texto
970
+ grafite, setas cinza); `:::suave` é cinza neutro (externos). Mapa mental: uma família por ramo (o Mermaid
971
+ pinta o ramo N com a cor N+1; contorno e linha acompanham). Pintura por grupo em `paint()` (geometria:
972
+ cada nó pega a família do menor grupo que o contém).
973
+ - Direção automática (pedido de Naruminho: "o gerador tem que decidir a disposição"): o fluxograma é desenhado em
974
+ LR e em TB e fica o que deixa a letra maior (troca só se for 12% melhor); `autoDirection: false` mantém.
975
+ - Conferência pelo desenho: `diagramCheck` (`src/studio/snapshot.js`) desenha no Chrome headless; em
976
+ `src/ai/deck-ai.js`, `checkDrawings` devolve à IA o erro de sintaxe (corrigir) e o "encolheu demais"
977
+ (objeção única, soft). Ligado no chat, no gerar deck (Studio, biblioteca e CLI) e no napkin.
978
+ - Studio: botão Inserir → Diagrama, formulário, miniatura desenhada, aviso na barra de status quando o
979
+ diagrama encolhe ou tem erro (vai junto para a IA em `renderNotes`).
980
+ - PDF/PPTX/foto para a IA esperam `window.SagaDiagramsReady`.
981
+ - Referência para a IA: seção "Diagramas (`diagram`)" em `docs/REFERENCIA.md`, com regras de bom desenho.
982
+ - Testes: `test/diagram.test.js` (paleta, ênfase, ícone, tipos, contraste, aviso), `test/ai.test.js`
983
+ (erro e objeção voltam para a IA), `test/studio.test.js` (inserir pelo Studio).
984
+
985
+ Ideias que ficaram para depois (não bloqueiam):
986
+ - Setas "gordas" geométricas (chevrons de processo) não são do Mermaid: hoje o layout `steps` cobre; avaliar
987
+ um elemento próprio se a pessoa pedir.
988
+ - Editar o diagrama arrastando (tipo draw.io) está fora: a edição é pelo chat/código. Reavaliar com uso real.
989
+
990
+ ### Paletas de família: FEITO
991
+
992
+ - Pedido: identidade de marca sem cansar a vista (a cor forte da marca só no detalhe; a página trabalha com os
993
+ parentes mais agradáveis dela). Pré-definidas e **sem nome de empresa** (o software é distribuído livremente):
994
+ `rubi`, `ametista`, `tangerina`, `safira`, `esmeralda` em `src/themes.js`.
995
+ - Campo `family` (2 a 8 parentes) em qualquer paleta: vira `--c-f1..` e as séries 3 a 5 dos gráficos
996
+ (`familySeriesCSS`); nos diagramas, grupos e ramos usam os parentes (`familyOf`/`visible` em
997
+ `src/runtime/diagram.js`: parente claro demais escurece mantendo o matiz; faltando parentes, variações pequenas
998
+ de matiz/luminosidade, nunca o arco-íris). A ênfase (`alert`) nunca vira grupo nem ramo.
999
+ - Testes: `engine.test.js` (variáveis e séries), `diagram.test.js` (tudo na família, ênfase na cor forte).
1000
+
1001
+ ### Infográficos: FEITO
1002
+
1003
+ - Pedido (com 5 prints de templates): formas que o Mermaid não faz, com quantidade variável de itens e ajuste
1004
+ automático. Layout `infographic` (`src/infographic.js`), `shape`: `arco`, `ramos`, `lados`, `trilhas`, `metro`.
1005
+ - Palco de 1680×700: geometria em SVG, textos em HTML por cima (editáveis no PowerPoint). Caixa com `data-fit` e
1006
+ tamanhos internos em `em` (encolhem juntos); alinhamento `safe` (o excesso vai para baixo, onde a medida vê).
1007
+ - Cores `itemColors`: família da paleta ou tons harmônicos ao destaque, sempre com contraste 3 para letra clara.
1008
+ - Sombra e ponta de seta com id por slide (hash do conteúdo): com id repetido, o navegador usava a definição do
1009
+ 1º slide, invisível quando outro está na tela.
1010
+ - Testes: `engine.test.js` (formas, limites, cores), `infographic.test.js` (nada encavala, texto cabe, dentro do
1011
+ palco, setas do próprio slide; rode com `IG_THEME=rabisco` para a fonte larga), `studio.test.js` (inserir,
1012
+ trocar forma, adicionar item).
1013
+
1014
+ ### Fila combinada (próximas etapas, nesta ordem)
1015
+
1016
+ 1. ~~PowerPoint sem as notas do apresentador~~ FEITO: menu Arquivo e cartão da biblioteca ("Baixar PowerPoint sem as notas", `?notas=0`), CLI `--sem-notas`, `exportPptx({ notes: false })`. As notas continuam no deck.
1017
+ 2. ~~Identidade~~ FEITO (`src/identity.js`, `applyIdentity` em `src/themes.js`, grupo Identidade na aba Design, rotas `/api/identities`; paleta `oceano` renomeada para `safira` por colidir com o tema `oceano`). Desenho original: arquivo local `~/.sagadeck/identidades.yaml` (fica na máquina do
1018
+ trabalho, nunca no repositório), com fontes por papel (título, corpo, compacta) em ordem de preferência e a
1019
+ paleta preferida. Opcional e por deck (`identidade: nome`; Studio: Design → Identidade). Corpo e rótulos sempre
1020
+ na fonte da empresa; títulos grandes só nos temas sóbrios (os de personalidade mantêm a fonte do tema).
1021
+ Fallback: fontes digitadas → fonte do tema → genérica; aviso no Studio se nenhuma estiver instalada. Sem
1022
+ embutir o arquivo da fonte (licença). Fontes mais largas (rabisco/sketch): o ajuste de texto já remede quando a
1023
+ fonte chega; o diagrama agora espera `document.fonts.ready`.
1024
+ Correção depois: o grupo Identidade ficou alto e as 16 paletas espremeram a galeria de temas até sumir (a faixa
1025
+ rolava na vertical). Agora temas e paletas dividem o espaço, cada um com a sua rolagem (`.rgroup-gallery`), e o
1026
+ teste "Design: temas e paletas ficam à vista" confere em 1366 e 2000 px.
1027
+ 3. One-page, status semanal, governança navegável (abaixo): FEITOS.
1028
+
1029
+ Decisão pendente com Naruminho: manter MIT ou trocar para AGPL-3.0 (proteção contra uso fechado como serviço).
1030
+ Versões já publicadas como MIT continuam MIT.
1031
+
1032
+ ### Revisão da branch do GPT (`gpt-adaptativo`) e comandos da IA
1033
+
1034
+ - Aproveitado: correção do prompt (dizia que diagrama não é layout); aba JavaScript nos slides api (reescrita
1035
+ legível, no molde do Python; testada executando contra uma API de mentira); grades adaptáveis `mosaic`
1036
+ ("Grade adaptável"; "Mosaico" já era o bento), `ribbon`, `dossier` (`src/adaptive-layouts.js`; regra do item
1037
+ em destaque corrigida para a grade fechar sem buraco); modelos de demonstração (`src/studio/demo-decks.js`,
1038
+ capa comprimida de 1,9 MB para 144 KB; menu Nova agora cabe em janela baixa, com rolagem); regras do
1039
+ AGENTS.md. Galeria do Studio: teste novo falha se um layout do motor ficar fora dela (pegou também o
1040
+ `decisionlab`, que estava escondido).
1041
+ - Descartado: `scripts/restore-humano-bug.mjs` (alterava o conteúdo de uma palestra da pessoa, com caminhos da
1042
+ máquina dela), `scripts/wire-adaptive.mjs` (editava o código-fonte por substituição de texto) e
1043
+ `scripts/verify-demo-decks.mjs` (caminhos fixos da máquina).
1044
+ - Comandos da IA, redesenhados (`src/ai/commands.js`): a IA pede `run: {language, why, code}`; o Studio mostra
1045
+ o código e só roda com o clique (Executar / Executar e liberar os próximos / Não executar). Pedido pelo fluxo
1046
+ NDJSON (`phase: "approve"`), resposta em `/api/ai/approve`, presa ao usuário que pediu; 10 min sem resposta =
1047
+ recusado. Variáveis/segredos/token do ambiente como `SAGA_VAR_*`/`SAGA_SECRET_*`/`SAGA_TOKEN`, saída
1048
+ mascarada. Local: liberado para a pessoa da máquina. Multiusuário: só `--agentes` / `SAGADECK_AGENTES`
1049
+ (pedido de Naruminho: no servidor Oracle, a Mary usa tudo menos comandos).
1050
+
1051
+ ### 2. One-page: FEITO
1052
+
1053
+ - Layout `onepage`: jornada (etapas com ícone e mini-frase), o problema (texto, números grandes, tópicos), a solução
1054
+ e o painel (`dashboard: {numbers, figures}`): números grandes em cima; gráficos (os mesmos de `chart`, com `title`)
1055
+ e mapa por UF embaixo. Só aparece o que foi preenchido (bloco `{}` vazio some); sem painel, letra maior e conteúdo
1056
+ no meio; problema/solução + painel lado a lado; só o painel = dashboard de página inteira. Gráficos desenhados na
1057
+ proporção do quadro (1,5x e reduzidos, a letra acompanha). Limite de palavras próprio: 120 (status: 90).
1058
+ - Elemento novo `ufmap` (`src/figures/ufmap.js`): mapa do Brasil em grade (cartograma, sem geodados de fora), cor
1059
+ pela escala do `--em` do tema, UF sem valor apagada, `highlight`, legenda; em quadro estreito só as siglas. No
1060
+ mapa do one-page ganha coluna própria da altura do painel. Serve em qualquer lugar (`figure`, `side`…).
1061
+ - Studio: galeria (One-page), formulário (jornada, O problema/A solução com números e tópicos, Painel com números
1062
+ grandes e "Gráficos e mapa" como elementos); elemento "Mapa por UF" no seletor de elementos. `f.obj` com
1063
+ `stringAs` converte o atalho em texto (`problem: "…"`) em `{text}` sem perder o conteúdo.
1064
+ - Testes: `onepage.test.js` (motor, mapa, e no navegador cheio/só painel/simples sem nada fora, vazando do quadro
1065
+ ou encavalado em sinal, editorial e noite; gráfico não espremido), `studio.test.js` (criar pela galeria, problema
1066
+ e número do painel no deck salvo). Exportação PPTX/PDF conferida à mão.
1067
+
1068
+ ### 3. Status semanal: FEITO
1069
+
1070
+ - Layout `status`: saúde (`health` ok/risco/atrasado, com `healthLabel` para trocar o texto), avanço (`progress` %),
1071
+ destaque (`highlight`) e as seções feito, em andamento, bloqueios, riscos e problemas, próximos passos; item é texto
1072
+ ou `{text, owner, due}` ("Ana · até 30/09"); `shots` (até 3 telas com legenda) ao lado.
1073
+ - "Muito variável": só aparece o que foi preenchido. Grade de 6 trilhas: a última linha incompleta se reparte inteira
1074
+ (5 seções = 3 + 2, sem buraco); semana magra (até 6 itens, sem telas) ganha letra maior e o bloco no meio.
1075
+ - Studio: galeria (Status semanal) e formulário (saúde, avanço, listas com responsável e prazo, telas).
1076
+ - Testes: `status.test.js` (motor; no navegador, semana cheia e vazia sem nada fora do slide ou encavalado em
1077
+ sinal, editorial e noite), `studio.test.js` (criar pela galeria, saúde, avanço e bloqueio no deck salvo).
1078
+
1079
+ ### 4 e 5. Governança navegável: FEITO o recurso (navegação por caminhos)
1080
+
1081
+ - Pergunta do Naruminho: "como deixar isso navegável, organizado e útil?" (acesso → experimento ou projeto → DEV/HOM/
1082
+ PROD; caminhos que se abrem conforme o front-end). Resposta: um **mapa** e seções por caminho, em vez de sequência.
1083
+ - Layout `hub` (mapa de caminhos: pergunta + opções com ícone, texto, detalhe e seta). `goto` (id ou número) em opção,
1084
+ cartão, item de lista e etapa deixa o item clicável; `[texto](#id)` no meio do texto; no slide, `id`, `back`
1085
+ (botão "Voltar: <título do destino>" no canto; no terminal fica na barra da janela, no noite dentro da moldura) e
1086
+ `next` (o fim do caminho volta ao mapa em vez de seguir a ordem). `navWarnings` avisa destino inexistente e id repetido.
1087
+ - Funciona na apresentação (runtime: clique; `next` no fim do slide), no PDF (áreas clicáveis por cima das fotos das
1088
+ páginas, links internos) e no PowerPoint (`hyperlink: { slide }`, "hlinksldjump").
1089
+ - Studio: galeria (Mapa de caminhos), formulário do hub, "Ao clicar, ir para" em cartão/etapa/item e, em Mais
1090
+ opções de todo slide, "Id do slide", "Botão Voltar para" e "No fim, avançar para". REFERENCIA: seção "Navegação por
1091
+ caminhos" com exemplo (a IA sabe montar).
1092
+ - Testes: `navigation.test.js` (motor, cliques na apresentação, links no PDF e no PPTX), `studio.test.js` (mapa pelo
1093
+ formulário, destino e id no deck salvo).
1094
+ - O deck da governança em si (conteúdo do trabalho) não entra no repositório: vai para a biblioteca da pessoa.
1095
+
1096
+ ---
1097
+
1098
+ ## Como rodar os testes numa sessão na nuvem
1099
+
1100
+ `npm ci`, depois `SAGADECK_BROWSER=/opt/pw-browsers/chromium-1194/chrome-linux/chrome npm test`
1101
+ (sem essa variável, os testes de navegador são pulados em silêncio).
1102
+ - Correção adicional motivada pelo print: calc com oito resultados passa a usar grade adaptativa, preservando curvas e controles; reprodução automatizada e conferência no deck real passaram. Relatório de geração extraído para módulo próprio, mantendo o limite de tamanho do Studio.
1103
+ - Validação final da avaliação de narrativas: 705 testes, 685 passaram, 20 pulados, zero falhas. Bundle atualizado e servidor local reiniciado na 3517.
1104
+
1105
+ ### Aulas técnicas — primeira etapa validada (03/10/2026)
1106
+ - Rolagem até a linha ativa do codewalk e revisão visual do estado real do palco corrigidas. Suíte: 707 testes, 687 aprovados, 20 pulados, zero falhas; bundle atualizado.
1107
+ - Próxima etapa solicitada: eliminar piscada no traço, ampliar exploração de grafos e experimentos de programação, integrar imagens e capturas reais da pesquisa. As aulas servem para avaliar recursos gerais, preservando conteúdo existente.
1108
+
1109
+ ### Laboratórios interativos — implementação e validação em curso
1110
+ - Causa da piscada reproduzida: a entrada do quadro completo reiniciava em cada passo. Removida apenas no algo, preservando destaque de escritas/comparações.
1111
+ - Recursos gerais graphlab e codelab implementados, catalogados, formulários de Studio e referência da IA atualizados. Rede com cartões semânticos, menor custo, BFS, vizinhança, zoom/pan, foco, arraste, edição de custos e nós e restauração. Código usa o interpretador offline existente e aceita alteração de programa/entrada, sem prometer pacotes Python externos.
1112
+ - Pesquisa conserva URLs de imagens observadas; importador de imagens reais e captura pública com navegador, arquivos locais, proveniência e erros explícitos. Não desenhar interfaces fictícias no lugar de screenshots.
1113
+ - Material de estudo HTML incorpora experiências. Teste revelou history/wake lock inválidos no iframe sandbox; corrigido com isolamento mantido. 65 testes de motor/laboratórios aprovados, zero falhas; 29 regressões de pesquisa/exploração passaram na rodada anterior.
1114
+ - Chat nativo aplicando novos recursos à aula de grafos, com URLs reais da documentação Neo4j e galeria NetworkX. Nenhuma edição do YAML por script próprio.
1115
+
1116
+ ## Próxima etapa autorizada — execução, coleções e mídia
1117
+ - [x] Python nativo e JavaScript nativo, com saída real e erros visíveis.
1118
+ - [x] Coleções de APIs: importar/adicionar, selecionar serviço, editar pedido e executar; avaliar expansão para PDF/PPTX.
1119
+ - [x] Player do YouTube e importação opcional de vídeo MP4 para a biblioteca.
1120
+ - [x] Quadro isolado de HTML/CSS/JavaScript para animações personalizadas geradas pelo agente.
1121
+ - [x] Validar código e interações reais, documentar limites, publicar e reiniciar na porta 3517.
1122
+
1123
+ - Laboratórios validados: suíte completa com 716 testes, 696 aprovados, 20 pulados e zero falhas. Formulários extraídos para lab-fields.js; teste de conteúdo longo preserva identificadores e programas, sem duplicar nós. Regressões específicas: 26 aprovadas.
1124
+ - Aula de grafos ampliada pelo chat, preservando os slides anteriores: dois grafos exploráveis e telas reais oficiais de Neo4j Browser e galeria NetworkX, importadas localmente com proveniência.
1125
+
1126
+ ### Execução e mídia — integração em curso
1127
+ - Etapa anterior publicada e mergeada no PR #119 (a234dbb).
1128
+ - Implementados codelab Python/Node nativos, coleções Postman/seletor e expansão estática no Studio, playground HTML/CSS/JS isolado e player YouTube/MP4 local. Formulários dedicados e permissões do chat reutilizadas.
1129
+ - Download real validado com vídeo da documentação YouTube: MP4 de 57.498.089 bytes, áudio e vídeo reunidos via FFmpeg. Ferramentas instaladas em AppData/SagaDeck, checksum yt-dlp validado. Testes de navegador/Studio em andamento.
1130
+
1131
+ - Novo caso do usuário: divulgação do hackathon AI Apps. Usuário esclareceu que é somente brainstorm, sem gerar apresentação. Dados de agenda/regulamento ainda inexistentes; autorizou exemplos fictícios claramente identificados. Não criar deck de hackathon nesta etapa.
1132
+ - Oito testes novos de execução nativa, coleções/importação no Studio, exportação por serviço, frame isolado e MP4 real passaram. Nova rodada completa pendente.
1133
+
1134
+ ### Cena cinematográfica reutilizável — 03/10/2026
1135
+ - Usuário autorizou prosseguir com portal, transformação do cenário e tipografia integrada. Implementação genérica portal com catálogo ilustrativo, imagem própria por elemento, objetos persistentes antes/depois, movimento reduzido e demo cinematica; não criar a apresentação completa do hackathon.
1136
+ - Próximos passos: validar interação/formulário salvo e aspectos, revisar visualmente, suíte completa, publicar e reiniciar na 3517.
1137
+
1138
+ ### Reuniões com decisões e divulgação — implementação em curso
1139
+ - Novo pedido autoriza gerar a apresentação do evento e avaliar/corrigir a saída; substitui a restrição anterior de somente brainstorm. Conteúdo e planejamento pessoal ficam fora do repositório.
1140
+ - Enquete manual ampliada: contagens e abstenções salvas, aprovação explícita, empate bloqueado, reabertura e versão para participantes sem pendências internas. Valores aprovados atualizam calculadoras para simular consequências; exportação respeita o mesmo filtro.
1141
+ - Revisão visual real encontrou fonte inconsistente nos controles e convite cortado na cenografia. Corrigidos no motor; teste cenográfico falhou antes e passou depois. Votação, persistência, vinculação numérica e PPTX público passaram nos testes específicos.
1142
+ - Suíte completa anterior: 726 testes, 705 passaram, 20 pulados, uma falha no tamanho de ícone do portal; correção confirmada pelos testes específicos. Nova suíte em execução, publicação ainda pendente.
1143
+
1144
+ ### Validação final da etapa
1145
+ - Suíte completa: 729 testes, 709 passaram, 20 pulados, zero falhas (918,6 s). Correções finais de publicação/legibilidade verificadas novamente em testes específicos; anotações internas não entram na versão pública.
1146
+ - Revisão de apresentação real: 22 slides percorridos, sem texto ou controles fora da área útil, portal e experiência personalizados conferidos no navegador. Documento e evidências somente na biblioteca pessoal.
1147
+ - Recursos genéricos prontos: execução Python/Node, coleções, vídeo, frame isolado, portais e decisões persistentes; falta somente concluir publicação da etapa no GitHub.
1148
+
1149
+ - Entrega publicada e mergeada: PR #120 (https://github.com/naruminho/sagadeck/pull/120), merge 1fb5a6f. Bundle atualizado, serviço local reiniciado na 3517. HTML de divulgação verificado sem controles de votação ou notas internas. CI remoto em andamento no momento do merge; suíte local e regressões finais aprovadas conforme acima.
1150
+
1151
+ ### Transições A/B capa→próximo (saida × morph) — em curso na feat/light-portal-direction
1152
+ - Pedido do Naru para o hackathon: comparar duas transições high-tech entre slides — A) capa sai / próximo entra, B) morph que se transforma no próximo — com a IA do sagadeck refazendo só pelo que vê no `ref`.
1153
+ - Implementado: `transition: saida` (anterior recua com escala 1.06 e dissolve em 450ms, próximo sobe 48px em 600ms) e `transition: morph` (crossfade 850ms com respiro de escala + FLIP de `continuity:` já existente) em `src/runtime/base.css` + gancho no `goto()` em `src/runtime/runtime.js` (sem movimento em `instant`, exportação ou preferência reduzida). Documentado em `docs/REFERENCIA.md`; formulário do Studio trocou a lista fantasma (`slide/zoom/none`, que nunca existiram) pelas reais (`fade/cut/saida/morph`).
1154
+ - Testes: `data-tr` emitido (`engine.test.js`) + classes de saída aplicadas/removidas e zero erros JS (`runtime.test.js`, navegação por teclado como a pessoa usa — o `goto` exposto é sempre `instant`). Suítes afetadas verdes: engine 59/59, runtime 34/34.
1155
+ - Publicado: commit 80da025 na feat/light-portal-direction (só os arquivos desta etapa; o trabalho anterior da branch continua no disco).
1156
+ - Paleta `luzquente` (etapa 2, mesmo branch): brancos quentes + âmbar com família, para futurista de bom gosto sem neon barato; no `tone: dark` vira HUD âmbar sobre carvão quente. Doc no `ref`; engine 61/61.
1157
+ - Eco `ambient: pontos|grade` (etapa 2): camada viva discreta atrás do conteúdo (poeira de luz à deriva / grade em perspectiva), com `data-ambient`, aviso em valor inválido, campo no formulário e testes de motor + navegador.
1158
+ - Figura `{ points: forma }` e morph `{ points: { de: fone, para: mic } }` (etapa 2): `src/figures/points.js` rasteriza 6 formas (`fone`, `mic`, `doc`, `planilha`, `busca`, `chat`) em luzinhas SVG ordenadas por ângulo; `src/runtime/points.js` viaja cada ponto no clique/Enter com legenda que troca; parado com movimento reduzido; PPTX/PDF usam a inicial. Testes de motor + navegador verdes; runtime 38/38.
1159
+ - Falta nesta frente: aplicar no deck do hackathon (com o Naru conferindo), `npm run bundle` + suíte completa antes de publicar.
1160
+ - IA preparada para gerar o cinema sozinha (etapa 3): nova direção criativa "Cinema hacker de bom gosto" (`src/ai/variety.js`) + seção "Direção cinematográfica" no `ref` mapeando "Tony Stark/hacker/futurista" para noite+luzquente+ambient+morph+points e as regras de gosto. Prompt verificado: Tony Stark, luzquente, points, morph e a regra anti-neon presentes no `reference()`. Teste novo: toda direção indica tema existente. Engine 62/62.
1161
+ - Areia fina como a foto (etapa 4): pontos vazados em passo 0.25 com opacidade variada e joias, brilho sutil, legenda embaixo; slide do deck com fundo preto puro e legendas de serviço (`SPEECH TO TEXT` → `RESUMO COM AÇÕES`). Visto em screenshot: mic de contorno dourado no preto, morph para o balão, zero erros.
1162
+ - Suporte a vídeo (etapa 5, sem gastar): `{ video: cena.mp4, loop: true, poster }` repete sozinho sem controles; `tools/generate-video.mjs` envia/polla/baixa via OpenRouter (`--dry-run` valida no catálogo de graça — passou). Roteiro dos 3 clipes em `docs/PLANO-VIDEO-CINEMA.md`. Aguardando liberação: 1 clipe curtinho de teste, depois o brief do filme da areia.
1163
+ - Prova com vídeo real (etapa 6, sem gastar): capa Stark demo (noite+luzquente+ambient) e trailer do Sintel (52 s, 6,4 MB) baixado do YouTube, embutido em loop e visto em screenshots — player com loop/autoplay/muted e readyState 4, zero erros e zero avisos de build. Achados: yt-dlp exige runtime JS (o sagadeck já passa o node) e sem ffmpeg a junção falhava — `downloadYoutube` agora cai para arquivo único; testes cobrem os dois ramos.
1164
+
1165
+ ### Preparação de vídeo pelo chat e direção por conteúdo — 03/10/2026
1166
+ - Usuário rejeitou a aparência de portal/contornos 2D como substituta do filme 3D. Geração paga condicionada a briefing e aprovação; nenhum vídeo gerado nesta etapa.
1167
+ - Ferramenta nativa de comando `language: video`: operações curtas plan/submit/status/download, jobs persistidos na pasta do deck, catálogo validado, MP4 local reaproveitado. Corrigidos argumentos separados do CLI e URL relativa de polling (sem prefixo duplicado). Testes simulam API, custo zero no planejamento e download sem token no CDN.
1168
+ - Instruções ao agente agora selecionam formatos por função narrativa, revisam repetição visual e preservam a paleta solicitada. Distinguem SVG 2D, transição CSS e filme volumétrico; não prometem 3D quando só há pontos ou crossfade.
1169
+ - Poster de vídeo local incorporado no HTML; loop retoma ao voltar ao slide. Regressão reproduzida antes e passou após correção. Portal claro/transição contínua da frente anterior preservados para outros usos, sem insistir nesse recurso para a direção rejeitada.
1170
+ - Roteiro pessoal da etapa anterior removido do repositório e preservado na biblioteca. Briefing novo fica somente na pasta pessoal. Suíte completa e publicação pendentes.
1171
+ - Controle de palco incluído: início manual sem autoplay, avanço por clique ou pelo frame/fim do vídeo, revelação da composição por baixo sem recriar título, fade sincronizado ao mediaTime. Formulário do Studio salva início/final; testes verificam título persistente, ausência de timer e geometria/continuidade do vídeo (antes, el descartava x/y/w/h).
1172
+ - Primeira suíte completa: 750 testes, 727 passaram, 20 pulados, 3 falhas diagnosticadas (descoberta local de FFmpeg interferia no teste sem FFmpeg; quebra CRLF no exemplo da documentação; formato da dica de tema). As três regressões passaram após correção. Nova rodada completa necessária com os controles de palco finais.
1173
+ - Validação final: 754 testes, 734 passaram, 20 pulados e nenhuma falha. Bundle atualizado. Controles de abertura manual, revelação sincronizada e ferramenta de vídeo prontos para publicação.
1174
+
1175
+ ### Abertura de palco e pesquisa sem espera indefinida — 03/10/2026
1176
+ - `controls: stage`: início e avanço por clique ou teclado, sem controles visíveis para a audiência. O primeiro comando inicia; outro permite pular. O próximo slide pode ser a capa final nativa. Campo exposto no formulário e documentado para o agente.
1177
+ - Regressão reproduzida antes da correção: controles denunciavam a abertura e Espaço avançava em vez de iniciar. Teste de navegador agora verifica espera, ausência de controles, início, avanço e zero erros. Formulário salva o modo no deck.
1178
+ - Pesquisa: “Anotando…” era uma chamada ao LLM, com respostas de até 12 mil tokens e tentativas longas. Anotação agora curta, sem raciocínio adicional, com prazo total de 45s compartilhado pelas tentativas; ao esgotar avisa e continua. Teste com provedor lento falhou antes e passa após a correção, sem chamada repetida.
1179
+ - Geração: quantidade e formato explicitamente pedidos prevalecem sobre estimativa de duração; slide único não recebe capas/encerramentos/referências extras. Teste confere o prompt e resultado de um slide, sem heurística de palavras no código.
1180
+ - Testes focados passaram. Suíte completa em execução; dados pessoais, frames e vídeos permanecem somente na biblioteca.
1181
+ - Validação concluída: suíte completa com 757 testes, 737 passaram, 20 pulados e zero falhas. Bundle atualizado; abertura de palco e pesquisa com prazo prontas para publicação.
1182
+
1183
+ ### Movimento declarativo e prova pelo agente — 03/10/2026
1184
+ - Usuário exige geração pelo próprio chat, não apresentação artesanal como prova. Prévia pessoal aprovada preservada; teste real será feito em estudo separado.
1185
+ - Plano: (1) elementos nativos wireframe/requests/flow/chat, (2) início manual e handoff para vídeo, (3) referência e instruções do agente, (4) criação/revisão pelo chat real com evidências, (5) regressões + bundle + suíte completa + publicação.
1186
+ - Implementados `motion` e runtime de controle: geometria 3D projetada, fluxo, requests fictícios sem reiniciar loop, chat determinístico com entrada/envio/pensando/resposta/leitura. Frames isolados sem rede; pausa fora do slide e movimento reduzido.
1187
+ - Teste de elemento falhou antes da implementação e passa; teste de navegador valida entrada antes do balão, fase de pensamento e avanço. Handoff para vídeo e prova real ainda em validação. Nenhuma nova geração paga de vídeo autorizada nesta etapa.
1188
+
1189
+ - Prova real concluída pelo endpoint do próprio chat (modelo real, sem edição externa do YAML): criou abertura, capa e conteúdo nativos; revisão pelo mesmo chat corrigiu contraste e escala do detalhe. Navegador confirmou espera manual, digitação antes do balão, pensamento, avanço automático e zero erros. Evidências e estudos ficam na biblioteca pessoal. Handoff chat → vídeo existente passou em teste de navegador, sem nova geração paga.
1190
+ - Segundo caso real pelo chat: slide de logística com motion flow, sem referência ao hackathon ou à Bridge; elemento criado pelo modelo. Nenhuma regra de código depende do tema de apresentação.
1191
+ - Validação final: suíte completa existente com 757 testes (737 passaram, 20 pulados, zero falhas), mais três testes novos de motion executados separadamente e verdes. Testes antigos de movimento preservados. Bundle atualizado; pronto para publicação.
1192
+ - Preferência confirmada pelo usuário: composição nativa/editável é o padrão sem precisar pedir; conferir saída antes de sugerir experiência personalizada ou mídia paga. Mídia paga não é proibida; benefício, briefing, custo e autorização existente guiam a alternativa. Diretriz adicionada no início da referência do agente.
1193
+
1194
+ ### Chat cancelável, apresentações por aba e transferência de slides — 03/10/2026
1195
+ - Reproduzidos: entrada bloqueada durante IA e abertura de outra apresentação redirecionando contexto global. Contextos agora separados por usuário + aba; tarefa captura arquivo de origem, faz junção com arquivo atual e não aplica resultado cancelado.
1196
+ - Entrada permanece disponível para preparar mensagem; enviar vira Parar (ícone quadrado), volta ao terminar. Cancelamento chega ao modelo, revisão, transformação e subprocessos; fechar aba corta o chat.
1197
+ - Copiar/Colar na faixa Início e Ctrl+C/Ctrl+V na lista: slide vai para outra apresentação com novos identificadores e arquivos locais copiados sem colidir; somente mídias referenciadas, não pastas inteiras ou credenciais. Clipboard do Studio separado por usuário.
1198
+ - Testes regressivos falharam antes e passaram após a correção: cancelamento de chamada pendente, isolamento entre apresentações, cópia entre abas com imagem gravada no destino. Suíte completa e publicação pendentes.
1199
+ - Validação concluída: npm test com 764 testes, 744 aprovados, 20 pulados e zero falhas. Isolamento por cabeçalho de aba preserva endpoints e autenticação; transformações sobrevivem ao recarregamento, cancelamento explícito continua disponível.
1200
+
1201
+ ### Documentos como fonte e direção contextual — 03/10/2026
1202
+ - PDF/Word anexados são persistidos na pasta da apresentação com inventário visual. Word recupera imagens, tabelas e OMML; PDF recorta elementos via visão e preserva a página inteira com aviso quando a identificação falha. Inventário acompanha pedidos futuros no chat.
1203
+ - Anexos são fonte exclusiva por padrão; pesquisa exige autorização explícita reconhecida pelo modelo. Documentos não fornecem instruções. Seleção, tom, densidade e estilo dependem de conteúdo, público e objetivo; pedido explícito prevalece. Humor permite fontes informais como opinião.
1204
+ - Compartilhamento: reproduzida corrupção do Mermaid pela inserção do botão de download dentro de uma string `</body>` do fornecedor. Inserção agora ocorre somente no fechamento real do HTML; regressão de compilação JavaScript passou após falhar antes.
1205
+ - Modelos do Oracle alinhados ao Windows, incluindo configuração de vídeo Veo 3.1 Lite; planejamento validado sem submissão paga. PR #125 publicado e serviço local reiniciado na 3517.
1206
+ - Limites: gráficos Word sem cache ou de tipos não suportados ficam sinalizados; recortes PDF exigem revisão quando o modelo não enxerga. Aplicação visual completa de template PPTX não implementada nesta etapa.
1207
+ - Testes focados aprovados: inventário Word/PDF, fallback, seleção editorial, anexo no chat com imagem gravada no slide e reutilização na próxima mensagem, pesquisa exclusiva/complementação. Suíte completa em validação.
1208
+
1209
+ - Teste real de paper encontrou respostas de visão truncadas antes do inventário. Visão agora usa orçamento por página configurável, sem raciocínio nessa tarefa, coordenadas explícitas e limites de texto do PDF para proteger rótulos e legendas. Inventário incompleto pode ser refeito; texto do material inventariado não perde conclusões no antigo corte de 12 mil caracteres.
1210
+ - Barra flutuante acompanha reflow/movimento da seleção, deixando o texto livre. Regressão reproduziu a barra sobre o objeto e testou o segundo clique para digitar.
1211
+ - Diagnóstico geral: motivo de término preservado em JSON e streaming; tokens, timeout, créditos, acesso, conexão e arquivos distinguíveis. Código e referência para suporte, causa desconhecida explícita, sem resposta bruta/credenciais no aviso. Cancelamento permanece uma ação normal. Testes específicos aprovados; nova suíte completa em andamento.
1212
+ - Busca web real testada com sucesso após desligar raciocínio na resposta estruturada do buscador. Pesquisa somente leitura continua disponível para usuários sem execução local; teste de permissão atualizado para esse contrato, mantendo isolamento e bloqueio de comandos locais.
1213
+
1214
+ Atualização 04/10: screenshots revelaram hierarquia invertida e evidências tratadas como fotografias. Split agora prioriza figura informativa, empilha figuras largas e mantém contain; orientação do agente exige reconstrução de equações/tabelas legíveis sem duplicar original. CHAPTER 4.doc convertido com Word: 19 páginas, 151 objetos OLE de fórmulas, sem OMML. Teste real pelo upload em andamento usando inventário da renderização. Falhas transitórias do LLM têm retry limitado e cancelável; diagnósticos preservam mensagens específicas de APIs e conflitos de aba. Validação final e merge pendentes.
1215
+
1216
+ ### Validação integral pelo chat — 04/10/2026
1217
+ - Foco confirmado pelo usuário: o agente deve criar abertura com piada, capa tecnológica animada e conteúdo com pequenos movimentos coerentes, somente por instruções no chat. Decks continuam sendo validadores descartáveis, não solução personalizada escrita por fora.
1218
+ - Nova geração nativa iniciada com sequência completa e briefing consolidado; vídeo pago não será submetido antes de apresentar o prompt detalhado exigido anteriormente.
1219
+ - Regressões de movimento verificadas: chat digita no campo antes de enviar, pensa, responde e inicia vídeo manual; requests continuam variando; zero erros de navegador. Isso prova o runtime, não a qualidade da composição gerada.
1220
+
1221
+ - Prova integral encontrou AI_TOKEN_LIMIT antes de produzir o deck. Implementada recuperação em src/ai/staged-generation.js: planejamento conciso compartilhado, grupos de três slides e rejeição de etapas incompletas. Nenhum roteiro de evento foi hardcodado. Testes focados passaram; nova prova nativa em andamento após bundle/restart3517. Ainda não concluído nem mergeado.
1222
+ - Revisor recebe recursos de movimento/vídeo dos demais slides, além de títulos, para avaliar coerência da sequência. Pesquisa instruída a não substituir eventos/plataformas internos por homônimos públicos.
1223
+
1224
+ - A revisão da prova tentou remover movimentos obrigatórios para corrigir colisões. Reparo agora deve reposicionar/redimensionar recursos explicitamente pedidos, não eliminá-los. Acrescentado motionAccent: região reservada para detalhe nativo pequeno nos layouts seguros; teste real de navegador verifica conteúdo, movimento e rodapé separados.
1225
+ - Primeira prova completa após reinício gerou 17 slides, mas revisão terminou com 8 achados e faltavam movimentos em vários slides. Não aprovada. Nova prova precisa validar melhorias e conferir visualmente, depois planejar filme via chat.
1226
+
1227
+ - A capa criada pelo agente tinha código estático. Recurso genérico motion/terminal implementado: digita roteiro de lines/code, cursor, pausa de leitura, pausa fora do slide; documentação disponível ao agente. Teste no navegador passou.
1228
+ - Suíte completa: 787 testes, 766 passaram, 20 pulados, uma falha por CRLF no exemplo Mermaid da referência. Normalizado LF; teste de regressão passou. Nova suíte completa necessária após as alterações mais recentes.
1229
+
1230
+ - Prova nativa pelo chat executou video/frame e video/plan: captura real do slide em 1920px e consulta ao catálogo Veo, sem submit/custo. Ferramenta frame agora permite ao agente preparar suas próprias referências sem scripts externos. Frames e plano permanecem na biblioteca pessoal.
1231
+ - Movimento reduzido/exportação comunicam modo poster às cenas isoladas; terminal mostra roteiro completo para não confundir digitação inicial com texto cortado na revisão.
1232
+ - Nova prova criada em branco pelas APIs nativas e conduzida por /api/ai/chat com referência visual da capa anteriormente aprovada. Avaliação visual e filme final continuam pendentes; não declarar experiência completa.
1233
+
1234
+ - A referência aprovada é somente um caso de validação: o usuário reforçou que o chat precisa criar direções variadas, sem receita de capa específica no motor. Prova integral pelo chat gerou 18 slides; inspeção real encontrou título cortado, logo provisório, iframe ambiente maior que seu contêiner e votação com controles sobre a última opção. Ainda não aprovada.
1235
+ - Regressões reproduzidas e corrigidas: reparo automático agora preserva ferramentas e contexto; iframe ocupa integralmente a região reservada; votação distribui linhas sem sobrepor controles. Testes específicos falharam antes e passaram depois. Direção genérica de vídeo distingue poster/espera manual, texto existente versus letras novas, loop ambiente versus abertura e camadas chat/vídeo.
1236
+ - Studio reiniciado na 3517; refinamento solicitado pelo próprio chat com busca de logo real e preservação de recursos. Nenhum vídeo pago submetido nesta etapa. Suíte completa e avaliação final pendentes.
1237
+
1238
+ - Suíte completa anterior aprovada: 794 testes, 774 passaram, 20 condicionais pulados. Corrigidas depois as falhas reais de camadas/controles/ferramentas, com regressões específicas; nova suíte em curso.
1239
+ - Referências web agora incluem links observados aos arquivos de imagem originais, além de thumbnails. SVG autocontido é rasterizado em PNG transparente, sem conteúdo ativo/rede externa; testes de proporção, validação e importação aprovados.
1240
+ - Refinamento nativo falhou por limite de tokens após ferramentas, sem gravar o deck. Chat agora faz uma recuperação limitada, sem raciocínio, mantendo resultados e execução única; orçamento configurável. Regressão reproduziu a falha e passou com a correção, incluindo limite da segunda tentativa. Streaming/progresso continuam depois dos comandos. Nova prova real chegou à revisão das capas.
1241
+
1242
+ - Direção transversal implementada no agente, revisão e geradores de imagem/vídeo. Plano de vídeo mostra o prompt completo sem cobrança. Testes focados: 6 passaram; avaliação estética real continua necessária.
1243
+
1244
+ - Prova nativa de direção holográfica encontrou cores hex de seis dígitos convertidas em números pelo YAML: reprodução falhou com c.replace; corrigido em elementos, gráficos e motion, teste numeric-colors passou. A criação continua pelo chat, sem edição manual da apresentação.
1245
+
1246
+ - Teste nativo encontrou SVG ocultado por tipo anterior após merge: guard devolve renderizadores incompatíveis e pede null ao trocar figura. Outro achado: review:true no slide era ignorado sem flag no topo; agora solicita revisão dos alterados, com opt-out explícito preservado. Ambos reproduzidos antes da correção.
1247
+
1248
+ - Chat de vídeo sem burocracia (Rose): plan/status/frame/download rodam sem aprovação, só submit pede; IA resume em frase e só mostra tudo em erro. Achado crítico no caminho: code YAML sem aspas virava objeto e commandRequest destruía em "[object Object]" — preservado para video/web. Teste de chat de verdade no navegador (status livre + submit negado).
1249
+
1250
+ ### Consolidação 04/10 (Rose): pendências antigas que os merges resolveram- Resolvidas pelos PRs #120–#127: rodadas/suítes "pendentes" das seções de execução e mídia, cena cinematográfica, reuniões com decisões, validação final, abertura de palco, motion declarativo, chat cancelável e documentos como fonte (inclui CHAPTER 4 e staged-generation via #126).
1251
+ - Seguem ABERTAS de verdade: aprovação da capa (bloqueia vídeo e resto, gerações pausadas pelo Narumi), avaliação estética final da direção holográfica, liberação de budget dos clipes (teste + filme da areia) e a decisão MIT vs AGPL-3.0.
1252
+
1253
+ ### Autonomia total (Rose): o agente vigia, a pessoa não
1254
+ - Carimbo do motor na barra de status (versão + commit + início) via /api/instance; aprovação de submit mostra preço do catálogo; direções aprovadas salvas e injetadas no prompt; vigia baixa clipe pronto sozinho e avisa com toast; versões fotografadas a cada save com modal lado a lado e restaurar com rede.
1255
+ - Caça própria: YAML inexistente no cliente quebrava o init em silêncio (botões mortos); show do servidor agora manda slides prontos. Módulos extraídos para respeitar a trava de 100KB do server.js.