@pixeleducacao/curso-openclaw 2026.5.8 → 2026.5.10

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 (42) hide show
  1. package/assets/skills/_registry.md +41 -13
  2. package/assets/skills/operacional/_registry.md +6 -0
  3. package/assets/skills/operacional/backup-workspace-github/SKILL.md +39 -3
  4. package/assets/skills/operacional/commit-diario-workspace/SKILL.md +233 -0
  5. package/assets/skills/operacional/cron-resume-wizards/SKILL.md +329 -0
  6. package/assets/skills/operacional/seguranca-checklist/SKILL.md +202 -0
  7. package/assets/skills/starter/_registry.md +13 -9
  8. package/assets/skills/starter/continuar-jornada/SKILL.md +358 -0
  9. package/assets/skills/starter/gera-log-jornada/SKILL.md +338 -0
  10. package/assets/skills/starter/onboarding-checklist/SKILL.md +416 -88
  11. package/assets/skills/starter/onboarding-checklist/references/arquivos-raiz.md +44 -16
  12. package/assets/skills/starter/onboarding-checklist/references/aula-menus.md +304 -0
  13. package/assets/skills/starter/onboarding-checklist/references/checklist-template.md +70 -1
  14. package/assets/skills/starter/onboarding-checklist/references/comandos-canonicos.md +337 -9
  15. package/assets/skills/starter/onboarding-checklist/references/mapa-aulas.md +17 -12
  16. package/assets/skills/starter/onboarding-checklist/references/principios-defensivos.md +772 -0
  17. package/assets/skills/starter/onboarding-checklist/references/sistema-de-mapas.md +2 -2
  18. package/assets/skills/starter/onboarding-checklist/references/wizard-header-template.md +51 -0
  19. package/assets/skills/starter/primeira-vitoria/SKILL.md +448 -53
  20. package/assets/skills/starter/primeira-vitoria/evals/evals.json +2 -2
  21. package/assets/skills/starter/wizard-agente/SKILL.md +123 -17
  22. package/assets/skills/starter/wizard-agente/evals/evals.json +3 -3
  23. package/assets/skills/starter/wizard-aluno/SKILL.md +28 -3
  24. package/assets/skills/starter/wizard-aluno/evals/evals.json +1 -1
  25. package/assets/skills/starter/wizard-autonomia/SKILL.md +157 -27
  26. package/assets/skills/starter/wizard-autonomia/evals/evals.json +2 -2
  27. package/assets/skills/starter/wizard-autonomia/screenshots/painel-hostinger-cli.jpg +0 -0
  28. package/assets/skills/starter/wizard-conectar/SKILL.md +382 -74
  29. package/assets/skills/starter/wizard-conectar/screenshots/github-pat/01-avatar-settings.png +0 -0
  30. package/assets/skills/starter/wizard-conectar/screenshots/github-pat/02-developer-settings.png +0 -0
  31. package/assets/skills/starter/wizard-conectar/screenshots/github-pat/03-tokens-classic.png +0 -0
  32. package/assets/skills/starter/wizard-conectar/screenshots/github-pat/04-generate-classic.png +0 -0
  33. package/assets/skills/starter/wizard-whisper-quick/SKILL.md +160 -23
  34. package/assets/skills/starter/wizard-workspace/SKILL.md +23 -4
  35. package/assets/skills/starter/wizard-workspace/evals/evals.json +1 -1
  36. package/assets/templates/HEARTBEAT.template.md +58 -0
  37. package/assets/templates/README.md +65 -13
  38. package/assets/templates/SOUL-stub.template.md +1 -1
  39. package/assets/templates/template-material-didatico.html +457 -0
  40. package/assets/templates/template-report-executivo.html +368 -0
  41. package/assets/templates/template-report.html +370 -0
  42. package/package.json +1 -1
@@ -238,6 +238,61 @@ Cada wizard começa com este check:
238
238
  | **Parcial** | Fazer só o que falta, narrar o que pulou e o que vai fazer |
239
239
  | **Nada feito** | Executar wizard inteiro normalmente |
240
240
 
241
+ ### P11 forte ao detectar `wizard_resume_step` (kit v2.5 — fix Mira retomada)
242
+
243
+ ⚠️ **NOVO em v2.5:** quando wizard é despachado E `wizard_resume_step` em MEMORY aponta pra ele (ex: `wizard_resume_step: wizard-autonomia.passo3`), wizard DEVE aplicar P11 com **agressividade extra** — assumir que aluno já passou por partes do fluxo e detectar estado real ANTES de mostrar copy de promessa.
244
+
245
+ **Padrão:**
246
+
247
+ 1. **Detecção primeiro, narração depois.** Se `wizard_resume_step` setado, rode TODOS os checks de P11 do wizard (validações de chave, comandos shell read-only, leitura de arquivos raiz) ANTES de qualquer mensagem ao aluno
248
+ 2. **Sumarize estado parcial em UMA mensagem.** Em vez de "Vamos configurar X em 4min..." (copy de promessa do passo 1, redundante pra aluno que voltou), use:
249
+
250
+ ```
251
+ "Voltamos pra fechar {nome_wizard_natural}. Detectei que:
252
+ - {item 1: ✓ já feito | ⏳ falta}
253
+ - {item 2: ✓ já feito | ⏳ falta}
254
+ - {item 3: ✓ já feito | ⏳ falta}
255
+
256
+ Próximo: {única coisa que falta}. Bora?"
257
+ ```
258
+
259
+ 3. **NÃO repetir narração de promessa**. Se wizard tem passo "Narrar o que vai acontecer" no início, esse passo é PULADO quando `wizard_resume_step` setado (aluno já ouviu).
260
+ 4. **Quando wizard conclui retomada**, MEMORY zera `wizard_resume_*` (ou `continuar-jornada` zera ANTES do dispatch — implementação a ser decidida por wizard).
261
+
262
+ **Exemplo concreto — wizard-autonomia retomando passo 3 após 4 dias:**
263
+
264
+ ❌ Comportamento ANTIGO (kit v2.4 e anterior):
265
+ - Despacha wizard-autonomia
266
+ - Wizard começa pelo passo 1 ("Vou liberar autonomia. Em 6min você sai daqui podendo me deixar trabalhar sozinho. Vou:..."). Aluno ouve copy completa de novo.
267
+ - Aí vai pro passo 2 (P11 — `openclaw exec-policy show` retorna `ask`). OK.
268
+ - Aí vai pro passo 3 (instruir colar comando).
269
+
270
+ ✅ Comportamento v2.5:
271
+ - Despacha wizard-autonomia COM contexto `wizard_resume_step: wizard-autonomia.passo3`
272
+ - Wizard pula passo 1 (narração).
273
+ - Roda P11 imediato: `openclaw exec-policy show` → `ask`.
274
+ - Mensagem ao aluno (P15 canonical):
275
+ ```
276
+ "Voltamos pra fechar autonomia. Você tinha pausado antes de colar o comando no terminal. Detectei: exec-policy ainda em `ask` (não yolo). Falta só colar o comando. Bora?"
277
+ ```
278
+ - Aluno responde. Wizard segue do passo 3.
279
+
280
+ **Wizards aplicáveis (todos retomáveis):**
281
+ - `wizard-whisper-quick` (`passo0` raramente — fluxo é fast)
282
+ - `wizard-agente` (passos 2/3/4/5 — perguntas)
283
+ - `wizard-aluno` (similar)
284
+ - `wizard-autonomia` (`passo3` — caso Mira)
285
+ - `wizard-workspace` (passos de criação)
286
+ - `wizard-conectar` (passos por chave: brave/github/chromium)
287
+ - `primeira-vitoria` (passo de geração — raramente pausável)
288
+
289
+ **Falhas que isso PREVINE (caso real Mira stress test):**
290
+
291
+ 1. Mira retoma após 4 dias. wizard-autonomia v1.5 começa do passo 1 (copy completa de promessa). Mira já ouviu isso 4 dias atrás — sente que kit "esqueceu" dela.
292
+ 2. Aluno em qualquer wizard retomando após pause longa fica perdido em narração de promessa quando só precisava da próxima ação concreta.
293
+
294
+ **Princípio 11 vs P11 forte:** Princípio 11 já manda detectar antes de pedir. P11 forte é a aplicação ESPECÍFICA quando há flag `wizard_resume_step` ativa — passa a sumarizar estado em vez de re-narrar wizard inteiro.
295
+
241
296
  ### O que cada wizard deve detectar
242
297
 
243
298
  | Wizard | O que detectar | Como |
@@ -305,6 +360,723 @@ NOTION_TOKEN=secret_xxx
305
360
 
306
361
  Skill nova que precisa de credencial: registra nome padronizado aqui. Não inventa formato próprio.
307
362
 
363
+ ### Aplicação especial v2.1: detecção de AMBIENTE e OS antes de instruir
364
+
365
+ ⚠️ **Adicionado em v2.1 do kit (Bruno feedback):** Detectar antes de pedir vai além de "credencial existe?". Vale também pra **plataforma** e **gerenciador de pacotes** quando wizard precisa instruir aluno a rodar comando.
366
+
367
+ **Tipos de detecção que devem rolar antes de qualquer instrução técnica:**
368
+
369
+ | Detecção | Como detectar | Onde aplicar |
370
+ |---|---|---|
371
+ | **Ambiente OpenClaw** | Sinais: workspace em `~/.openclaw/` (Managed) vs `/root/.openclaw/` (VPS root); aluno mencionou "Hostinger"/"painel" vs "VPS"/"SSH" | `wizard-autonomia` (CLI Hostinger vs SSH); `wizard-conectar` (cron-worker vs systemd) |
372
+ | **Sistema operacional** | `uname -s` ou `OSTYPE`; `/etc/debian_version`, `/etc/redhat-release`, `/etc/os-release` | `wizard-conectar` (gh install: brew vs apt vs dnf); qualquer skill que mande aluno instalar coisa |
373
+ | **Gerenciador de pacotes disponível** | `which brew`, `which apt`, `which dnf`, `which yum` | Antes de mandar `brew install X` cego — verificar se existe |
374
+ | **Skill já instalada no agente** | Listar skills disponíveis pro agente atual; checar se nome esperado está | Antes de invocar uma skill que assume disponibilidade (caso real: github skill em VPS) |
375
+
376
+ **Salva flag em `MEMORY.md`:**
377
+ ```yaml
378
+ ambiente: managed | vps-root | local-dev
379
+ os: macos | debian | ubuntu | rhel | other
380
+ package_manager: brew | apt | dnf | yum | other | none
381
+ ```
382
+
383
+ **Padrão pra mapeamento `OS → comando`:**
384
+
385
+ ```bash
386
+ # Exemplo: instalar gh CLI
387
+ case "$os" in
388
+ macos) CMD="brew install gh" ;;
389
+ debian) CMD="https://github.com/cli/cli/blob/trunk/docs/install_linux.md # apt + repo oficial" ;;
390
+ rhel) CMD="dnf install gh" ;;
391
+ *) CMD="manual"; INSTRUCOES="link da doc + caminho de fallback" ;;
392
+ esac
393
+ ```
394
+
395
+ **Falhas típicas que isso PREVINE (5 reportadas em escala v1.x):**
396
+ 1. `wizard-autonomia` mostrava CLI Hostinger pra VPS root (não tem painel) — fix v1.9.1
397
+ 2. `wizard-conectar` rodava `brew install gh` em Ubuntu (sem brew) — falha silenciosa
398
+ 3. `wizard-conectar` assumia GitHub skill instalada em VPS (não vem) — falha silenciosa
399
+ 4. (futuro) wizard-X assumindo Linux quando aluno tá em macOS/Windows
400
+ 5. (futuro) skill esperando `gh` quando aluno não tem
401
+
402
+ ---
403
+
404
+ ## Princípio 13 — Wizards são GUARD RAILS (passo bloqueante, retorna em desvio)
405
+
406
+ ⚠️ **NOVO em v2.1.** Adicionado depois de feedback consolidado de múltiplos alunos: agentes saem do passo no meio do wizard, improvisam, ou fogem quando aluno desvia. Wizard precisa ser **passo bloqueante** — só sai se aluno completar OU mandar comando canônico.
407
+
408
+ ⚠️ **ESTENDIDO em kit v2.4** — adicionada categoria **(c3) Mensagem mista** após stress test Pedro. Caso real Bruno: aluno mid-wizard manda `"renomear todas pra português? E que hora roda backup?"` — 2 perguntas distintas em 1 mensagem. P13 antigo só categorizava mensagem singular. Agente respondia as 2 longamente e perdia foco do passo. Aplica também a casos `(a)+(c2)` (resposta parcial ao passo + desvio de tópico).
409
+
410
+ **Regra:** quando um wizard está ativo (`active_wizard:` setado em `MEMORY.md`), TODA mensagem do aluno é classificada em **5 tipos**:
411
+
412
+ | Tipo | Exemplo | Ação |
413
+ |---|---|---|
414
+ | **(a) Resposta direta ao passo** | "Tina" pra "qual nome?" | Processa, avança pro próximo passo |
415
+ | **(b) Comando canônico de escape** | `cancela`, `pula`, `voltar 2`, `sobre`, `faq`, `ajuda`, `config`, `muda modo`, `corrige` | Honra (interrompe wizard se cancela; pula se pula; etc) |
416
+ | **(c1) Pergunta tangencial sobre o passo** | "isso é seguro?", "muda depois?", "?" (confusão) | Responde EM 1 LINHA + traz de volta ao passo |
417
+ | **(c2) Desvio total / outro tópico** | "como funciona memória semântica?", "queria configurar Google Calendar agora" | Anota em `## Perguntas pendentes` em MEMORY.md + traz de volta ao passo |
418
+ | **(c3) Mensagem mista** (kit v2.4) | "Tina, e quero conectar Google Calendar"; "renomeia pasta pra PT? E que hora backup?" | Processa APENAS a parte (a) que responde o passo, anota o resto em pendências, repete pergunta original |
419
+
420
+ **Padrão da mensagem de retorno (c2):**
421
+
422
+ ```
423
+ "Anotado: {resumo do desvio} — vou abordar depois.
424
+ Mas pra fechar este passo, preciso que você {ação específica do passo atual}."
425
+ ```
426
+
427
+ **Schema MEMORY.md pra suportar Guard Rail:**
428
+
429
+ ```yaml
430
+ active_wizard: wizard-agente # ou null se nenhum
431
+ active_step: 2 # passo dentro do wizard
432
+ awaiting: agent_name # o que o passo espera (free-text descritivo)
433
+ desvios_neste_passo: 0 # contador
434
+
435
+ ## Perguntas pendentes (capturadas durante desvios c2)
436
+ - {data}: aluno perguntou: "{texto literal}" — abordar quando wizard X terminar
437
+ ```
438
+
439
+ **Limite anti-loop:** após 3 desvios consecutivos no mesmo passo, agente oferece pausar:
440
+
441
+ ```
442
+ "Você desviou algumas vezes desse passo. Quer:
443
+ - Pausar e voltar depois (manda 'cancela')
444
+ - Pular esse passo (manda 'pula')
445
+ - Tentar de novo (responde a pergunta original)?"
446
+ ```
447
+
448
+ **Comportamento bloqueante NÃO se aplica a:**
449
+ - `complete_active` (após primeira-vitoria) — aluno tá em modo conversa normal, comandos canônicos disponíveis mas não há "passo travado"
450
+ - `wizard_dismissed: true` — aluno explicitamente saiu
451
+
452
+ **Casos especiais de classificação:**
453
+
454
+ - **Aluno corrige resposta anterior** ("espera, é Bruno, sem 2 n's"): trata como `corrige` canônico — backtrack 1 passo, edita, segue
455
+ - **Aluno responde parcial** (pediu 3 itens, mandou 1): aceita o item, completa o que falta. NÃO força resposta total
456
+ - **Aluno menciona algo de outro passo** ("Tina, e quero Google Calendar"): processa nome (avança), anota Google Calendar como pendência pro `wizard-conectar`
457
+
458
+ ### (c3) Mensagem mista — padrão canonical (kit v2.4)
459
+
460
+ Quando aluno manda 1 mensagem com **resposta parcial ao passo + desvio adicional** OU **múltiplas perguntas distintas**:
461
+
462
+ **Algoritmo:**
463
+
464
+ 1. Identificar a parte (a) que responde o passo atual
465
+ 2. Processar essa parte (avançar normalmente)
466
+ 3. Anotar TUDO o resto como itens em `## Perguntas pendentes` em MEMORY.md
467
+ 4. Repetir LITERAL a pergunta original do passo (P15)
468
+
469
+ **Texto canonical (P15 — literal):**
470
+
471
+ ```
472
+ "Anotei: {resumo curto do que ficou em aberto}. Vou abordar depois.
473
+
474
+ Antes, fechando este passo: {repete pergunta original do passo, literal}."
475
+ ```
476
+
477
+ **Exemplos:**
478
+
479
+ | Mensagem do aluno | Parte (a) processada | Anotado em pendências | Resposta canonical |
480
+ |---|---|---|---|
481
+ | "Tina, e quero conectar Google Calendar" (mid wizard-aluno passo nome do agente) | nome = "Tina" | "Google Calendar — abordar no wizard-conectar" | "Anotei: Google Calendar pra abordar quando chegar no passo 5. Antes, fechando este passo: tô confirmando que o nome é **Tina** — pode ser?" |
482
+ | "renomear pra PT? E que hora roda backup?" (mid wizard-workspace) | nada (são 2 perguntas, nenhuma é resposta direta) | "renomear pastas pra PT — abordar pós-onboarding"; "horário do backup-workspace-github — abordar pós-passo 5" | "Anotei: 2 dúvidas (renomeação de pastas + horário do backup). Vou abordar quando o wizard atual fechar. Antes, fechando este passo: {repete pergunta workspace original}." |
483
+ | "vou parar aqui, tô atendendo cliente" | nada (é cancela implícito — vai pra (b)) | n/a | trata como `cancela` (b) |
484
+
485
+ **Regra anti-loop específica de c3:**
486
+
487
+ - Se aluno repetir mensagem mista 2x seguidas no mesmo passo (sem responder a parte (a)), tratar a 3ª como (c2) puro: anotar tudo + trazer de volta uma vez. Se 4ª ainda for mista, oferecer pause (`wizard_resume_at`) — mesma regra anti-loop dos 3 desvios.
488
+
489
+ **Falhas que isso PREVINE (1 reportada via stress test):**
490
+
491
+ - Pedro (stress test 03/05/2026 fim do dia): mid-wizard-workspace manda `"posso renomear pastas? E que hora você roda backup?"` — agente respondia as 2 longamente e perdia foco no passo. Sem regra explícita pra mensagem mista, P13 não cobria.
492
+
493
+ **Por que c3 não vira (a)+(c2) dois eventos separados:**
494
+
495
+ Em UX de chat, aluno mandou UMA mensagem. Tratar como 2 eventos cria sensação de "agente confuso" ou "respondeu 2x sem motivo". c3 unifica resposta numa só passagem.
496
+
497
+ **Cron de retorno passivo (v2.1):** quando aluno cancela/pausa wizard OU 3 desvios disparam pause, MEMORY.md recebe:
498
+
499
+ ```yaml
500
+ wizard_resume_at: 2026-05-03T15:00 # ISO timestamp futuro
501
+ wizard_resume_step: wizard-conectar.passo3
502
+ wizard_resume_attempts: 0 # max 3 antes de virar dismissed
503
+ ```
504
+
505
+ Quando aluno volta naturalmente ao Telegram (skill `continuar-jornada` é trigger natural pra checar isso), agente detecta a flag vencida e oferece retomar. Cron-DM ATIVO depende de Onda 12 (infra de cron-worker por aluno) — por enquanto é passivo (detectado quando aluno volta).
506
+
507
+ ### ⚠️ Protocolo de TRANSIÇÃO entre wizards (kit v2.5.2 — fix Adrylan loop whisper→agente)
508
+
509
+ **REGRA CRÍTICA:** quando wizard A finaliza e despacha wizard B, MEMORY DEVE refletir transição limpa entre eles, e a 1ª mensagem de B DEVE ter marcador inequívoco. Sem isso, opções numeradas ambíguas (`1/2`) entre wizards consecutivos confundem o aluno — a resposta dele vira polissemântica.
510
+
511
+ **Caso real Adrylan stress test 03/05/2026:**
512
+
513
+ ```
514
+ 13:42 pula whisper
515
+ Bot: agendar(1) ou definitivo(2)?
516
+ 13:43 Aluno: "2" → bot confirma whisper definitivo
517
+ Bot: [DESPACHA wizard-agente] completar(1) ou refazer(2)?
518
+ 13:44 Aluno: "2" → bot RE-INTERPRETA como resposta do whisper, repete pergunta agente
519
+ 13:45 Aluno: "2" → bot repete pela 3ª vez
520
+ 13:45 Aluno: "refazer tudo" (escreveu por extenso) → bot finalmente avança
521
+ ```
522
+
523
+ 3 turnos perdidos por ambiguidade. Causa: `active_wizard` não trocou + 1ª mensagem de wizard-agente não tinha marcador claro de transição.
524
+
525
+ **Sequência obrigatória ao despachar wizard B a partir de wizard A:**
526
+
527
+ ```yaml
528
+ # DENTRO de wizard A — conclusão do passo final
529
+ active_wizard: wizard-A # ainda
530
+ active_step: ultimo_passo
531
+ # A faz cleanup (atualiza flags como agente_configured: true)
532
+
533
+ # TRANSIÇÃO (entre A e B)
534
+ active_wizard: null # ⚠️ ZERAR antes de despachar
535
+ active_step: null
536
+ awaiting: null
537
+
538
+ # DESPACHO de wizard B
539
+ active_wizard: wizard-B # ⚠️ SETAR ANTES da 1ª mensagem
540
+ active_step: 1
541
+ awaiting: {primeira_pergunta_de_B}
542
+
543
+ # 1ª mensagem de B (canonical):
544
+ # DEVE ter marcador inequívoco — ver template abaixo
545
+ ```
546
+
547
+ **Template canonical de 1ª mensagem do wizard B (P15 literal):**
548
+
549
+ ```
550
+ "✓ {confirmação curta do que A fez ou pulou}.
551
+
552
+ Agora vamos pra **{wizard-B nome natural}**: {1 frase do que vai rolar}.
553
+
554
+ {pergunta do passo 1 de B com opções renomeadas se houver risco de colisão}"
555
+ ```
556
+
557
+ **Substituições:**
558
+ - `{confirmação curta de A}`: "Whisper pulado definitivamente" / "Personalidade do agente configurada" / etc.
559
+ - `{wizard-B nome natural}`: "personalidade do agente" (não `wizard-agente.passo1`) / "autonomia" / "workspace" / etc.
560
+
561
+ **Exemplo concreto — fix do caso Adrylan:**
562
+
563
+ ❌ Comportamento BUGADO (kit ≤ v2.5.1):
564
+
565
+ ```
566
+ [whisper pulou definitivo]
567
+ Bot: "Beleza, pulando definitivo. Lembrete: pode voltar com 'ativa whisper'.
568
+ Agora entrei na personalidade do agente e detectei: ...
569
+
570
+ Pra seguir com segurança, escolhe:
571
+ 1. Completar só o que falta — preencher IDENTITY.md...
572
+ 2. Refazer tudo — faço backup antes e recrio identidade..."
573
+
574
+ Aluno: "2" ← ambíguo: bot pode interpretar como wizard-whisper.passo1.5 (definitivo) OU wizard-agente.passo1 (refazer)
575
+ ```
576
+
577
+ ✅ Comportamento v2.5.2 (transição com marcador inequívoco):
578
+
579
+ ```
580
+ [whisper pulou definitivo]
581
+ Bot: "✓ Whisper pulado definitivamente. Pode reativar com 'ativa whisper' quando quiser."
582
+
583
+ [transição: zera active_wizard:null → seta active_wizard:wizard-agente, active_step:1]
584
+
585
+ Bot: "Agora vamos pra **personalidade do agente** (passo 1 da jornada — IDENTITY/SOUL/AGENTS).
586
+
587
+ Detectei o estado atual:
588
+ • IDENTITY.md → placeholders/template
589
+ • SOUL.md → conteúdo real
590
+ • AGENTS.md → regras configuradas
591
+
592
+ Como você prefere?
593
+
594
+ a) Completar só o que falta — preencho IDENTITY, preservo SOUL/AGENTS
595
+ b) Refazer tudo — backup do atual + recrio os 3
596
+
597
+ Manda **a** ou **b**."
598
+ ```
599
+
600
+ **Mudanças nesta versão correta:**
601
+ 1. **2 mensagens separadas** (confirmação A + abertura B). Telegram dá respiro visual.
602
+ 2. **Marcador inequívoco** ("Agora vamos pra personalidade do agente" — aluno SABE que é outro wizard).
603
+ 3. **Opções renomeadas pra `a/b`** em wizard-agente quando vem após wizard com `1/2`. Letras diferentes evitam colisão entre respostas. Outra alternativa: usar palavras-chave (`completar` / `refazer`) em vez de números.
604
+
605
+ **Regra anti-colisão de numeração:**
606
+
607
+ ⚠️ **Quando 2 wizards consecutivos teriam mesmas opções numéricas (`1/2`), o segundo DEVE renomear pra letras (`a/b`) OU palavras-chave (`completar`/`refazer`).** Aluno tipicamente responde curto ("2"); ambiguidade é silenciosa, gera loop. Casos conhecidos:
608
+ - whisper-quick passo 1.5 (`1`/`2` — agendar/definitivo) → wizard-agente passo 1 (sempre renomeia pra `a`/`b` ou palavras)
609
+ - wizard-agente passo "100% pronto" (`a`/`b`/`c` — manter/ajustar/refazer) → wizard-aluno passo 1 (numera diferente OU usa palavras)
610
+ - wizard-conectar (passo a passo numerado) → primeira-vitoria (sempre usa nomes ou letras diferentes)
611
+
612
+ **Falha que isso PREVINE (caso real Adrylan stress test 03/05):**
613
+
614
+ 3 turnos perdidos no loop transição whisper→wizard-agente. Aluno escreveu "refazer tudo" por extenso pra finalmente quebrar a ambiguidade. P13 cobria desvios DENTRO do wizard, mas não cobria handoff AB→BC. v2.5.2 adiciona regra de transição explícita.
615
+
616
+ ---
617
+
618
+ ### ⚠️ Protocolo de pause CORRETO (kit v2.5 — fix Mira stress test)
619
+
620
+ **REGRA CRÍTICA:** quando wizard pausa, MEMORY DEVE refletir estado pausado, NÃO ativo. Sem isso, cron-resume-wizards verifica `active_wizard != null`, conclui "wizard ativo, pulando ciclo", e DM nunca chega — bloqueando o próprio resgate (caso real Mira: pausou no passo 3 fechando Telegram, ficou 4+ dias sem nudge).
621
+
622
+ **Sequência obrigatória ao pausar (qualquer caminho — cancela explícito, 3 desvios consecutivos, ou inferência silenciosa por threshold):**
623
+
624
+ ```yaml
625
+ # Estado ANTES (wizard rodando)
626
+ active_wizard: wizard-autonomia
627
+ active_step: 3
628
+ awaiting: terminal_aberto
629
+ desvios_neste_passo: 0..N
630
+
631
+ # Estado DEPOIS do pause (wizard pausado)
632
+ active_wizard: null # ⚠️ ZERAR — wizard pausado ≠ ativo
633
+ active_step: null
634
+ awaiting: null
635
+ desvios_neste_passo: 0
636
+ wizard_resume_at: 2026-05-03T19:00:00-03:00 # quando reagendar (cron lê isso)
637
+ wizard_resume_step: wizard-autonomia.passo3 # qual wizard.passoN retomar
638
+ wizard_resume_attempts: 0 # ⚠️ ZERAR ao SETAR (não acumular)
639
+ ```
640
+
641
+ **Pontos críticos:**
642
+
643
+ 1. **`active_wizard: null` no pause.** Sem isso, cron-resume bloqueia DM (anti-overlap funcionando contra o objetivo).
644
+ 2. **`wizard_resume_attempts: 0` ao SETAR `wizard_resume_at`** — mesmo que já tinha attempts de pause anterior em outro passo. Cada pause é evento NOVO, contagem zera. Sem isso, attempts de passo 3 (ex: 2) acumula em pause de passo 4 → DM chega em "última tentativa" sem alunos saber.
645
+ 3. **Inferência silenciosa por threshold** (caso aluno fecha Telegram sem comando explícito): se `last_user_message_at > 12h` em wizard ativo, ao próximo ciclo do cron OU próxima interação do aluno, agente aplica este protocolo (zera `active_wizard` + seta `wizard_resume_at: now() + 0`). 12h é conservador (não 2h — risco de zerar wizard de aluno em meeting longo). Plus alternativo: Princípio 9 (parar quando algo dá errado) — pause silenciosa também é "algo deu errado" do ponto de vista do design.
646
+
647
+ **Quem zera `wizard_resume_*` ao retomar com sucesso:** continuar-jornada (passo 5 da própria SKILL — "cleanup quando aluno responde"). Quando wizard retomado conclui, ele NÃO precisa zerar `wizard_resume_at` — continuar-jornada já fez quando despachou. Cleanup centralizado evita drift de estado.
648
+
649
+ **Falhas que essa regra PREVINE (caso real Mira stress test 03/05 madrugada):**
650
+
651
+ 1. Aluno pausa silenciosamente em passo N (fecha Telegram). `active_wizard` não zerado. Cron rodando 09 + 19 BRT loga "wizard ativo, pulando ciclo" eternamente. DM canonical nunca dispara. Mira ficou 4 dias sem retomada possível (todas as DMs canceladas pelo guard).
652
+ 2. Aluno pausa em passo 3 (attempts=2 do antigo pause). Wizard-workspace seta novo `wizard_resume_at` em passo 4 sem zerar attempts. 1 DM no passo 4 já vai pra `wizard_dismissed: true` (ciclo curto demais).
653
+
654
+ ---
655
+
656
+ ## Princípio 14 — Smoke tests visíveis (mostra comando + output, nunca finge)
657
+
658
+ ⚠️ **NOVO em v2.1.** Adicionado depois de bug "áudio falso" reportado por Dr. Thiago: agente afirmou ter validado áudio com texto que aluno não disse. Causa-raiz: agente não rodou `curl` da API Whisper, inventou transcrição plausível.
659
+
660
+ **Regra:** quando SKILL pede pra agente rodar comando externo (curl pra API, bash exec-policy show, gh CLI install, openclaw command, etc), agente DEVE mostrar:
661
+
662
+ 1. **O comando exato que rodou** (em bloco de código)
663
+ 2. **O output literal** (em bloco de código)
664
+ 3. **Só DEPOIS** interpretar/narrar o resultado
665
+
666
+ **Sem comando+output mostrado = ABORTAR e perguntar ajuda. NUNCA fingir que rodou.**
667
+
668
+ ### Padrão correto
669
+
670
+ ```
671
+ "Vou validar a chave Whisper rodando call de teste à API:
672
+
673
+ ```bash
674
+ curl -s https://api.openai.com/v1/models \
675
+ -H "Authorization: Bearer $OPENAI_API_KEY" \
676
+ -o /dev/null -w "%{http_code}"
677
+ ```
678
+
679
+ Output:
680
+ ```
681
+ 200
682
+ ```
683
+
684
+ ✓ Chave válida (HTTP 200). Whisper pronto."
685
+ ```
686
+
687
+ ### Padrão INCORRETO (NUNCA fazer)
688
+
689
+ ```
690
+ "✓ Validei a chave Whisper, tá funcionando. Bora pro próximo passo."
691
+ [sem mostrar comando, sem output, sem evidência]
692
+ ```
693
+
694
+ ### Quando o comando FALHA
695
+
696
+ Mostrar mesmo assim — fingir sucesso é o pior dos mundos:
697
+
698
+ ```
699
+ "Tentei validar a chave:
700
+
701
+ ```bash
702
+ curl -s https://api.openai.com/v1/models \
703
+ -H "Authorization: Bearer $OPENAI_API_KEY" \
704
+ -o /dev/null -w "%{http_code}"
705
+ ```
706
+
707
+ Output:
708
+ ```
709
+ 401
710
+ ```
711
+
712
+ ❌ HTTP 401 = chave inválida ou revogada. Você quer:
713
+ (a) Gerar nova chave (te guio)
714
+ (b) Pular esse passo (manda 'pula')"
715
+ ```
716
+
717
+ ### Aplica IMEDIATAMENTE em
718
+
719
+ - `wizard-whisper-quick`: validação de chave + smoke test áudio (mostrar curl real, output literal da transcrição)
720
+ - `wizard-autonomia`: detecção de exec-policy + verificação pós-comando (mostrar `openclaw exec-policy show`)
721
+ - `wizard-conectar`: validação Brave Search + GitHub Token + install gh CLI (mostrar comandos de install + output)
722
+ - `backup-workspace-github`: validação de cron + primeiro push (mostrar saída do `gh repo create`, etc)
723
+ - Qualquer skill futura que rode comando externo
724
+
725
+ ### ⚠️ Regra UX EXPECTATIVA antes de comandos longos (kit v2.5.3 — fix Allan silêncio 10min)
726
+
727
+ ⚠️ **CRÍTICO:** quando agente vai rodar comando que tipicamente leva >2min (install via apt/brew, restart de Gateway, primeiro push de repo grande, build, etc), DEVE mandar mensagem de aviso ANTES de invocar o tool — NÃO durante.
728
+
729
+ **Por que ANTES e não DURANTE:** durante a execução do tool, agente fica BLOQUEADO esperando retorno. Não tem mecanismo de interromper espera pra mandar update intermediário (tool execution é síncrona em LLMs). A solução real é setar EXPECTATIVA antes do bloqueio começar.
730
+
731
+ **Texto canonical (P15 — usar literal):**
732
+
733
+ ```
734
+ "Vou rodar {nome do comando legível} agora. Pode levar ~Nmin
735
+ ({razão concreta — instalar X via apt, restart Gateway, primeiro push
736
+ do repo, etc}).
737
+
738
+ Aguenta — volto com resultado quando terminar."
739
+ ```
740
+
741
+ **Substituições:**
742
+ - `{nome do comando legível}` — em linguagem natural pro aluno (não comando shell cru)
743
+ - `{N}` — estimativa real em min (1-2 / 2-5 / 5-10)
744
+ - `{razão concreta}` — o motivo factual da demora (não vago)
745
+
746
+ **Exemplos:**
747
+
748
+ ❌ Vago: "Vou processar um pouco aqui — leva uns minutos."
749
+
750
+ ✅ Canonical: "Vou reinstalar o Chromium fora do Snap (via apt). Esse processo reinicia o Gateway e leva ~3-5min total. Aguenta — volto com resultado quando estabilizar."
751
+
752
+ ❌ Vago: "Configurando GitHub..."
753
+
754
+ ✅ Canonical: "Vou criar o repo privado de backup no seu GitHub e fazer primeiro push do workspace. Leva ~1-2min (depende do tamanho). Volto com confirmação."
755
+
756
+ **Onde aplica (kit v2.5.3):**
757
+
758
+ | Skill | Comando longo | Estimativa | Razão |
759
+ |---|---|---|---|
760
+ | `wizard-conectar` | Reinstalar Chromium fora do Snap (VPS root) | 3-5min | apt install + restart Gateway |
761
+ | `wizard-conectar` | Primeiro push GitHub de workspace populado | 1-2min | Tamanho do diff inicial |
762
+ | `backup-workspace-github` | Primeiro snapshot + push | 1-3min | Criar repo + zip workspace + push |
763
+ | `wizard-autonomia` | Reset do Gateway pós-yolo (raro) | 30-60s | restart processo |
764
+
765
+ **O que essa regra NÃO cobre:**
766
+ - Comandos rápidos (<30s) — não precisa aviso
767
+ - Comandos cuja duração é imprevisível (depende de input externo, ex: aluno responder 2FA email) — esses ficam em estado "aguardando aluno" (não wizard travado)
768
+ - Updates intermediários durante execução do tool — IMPOSSÍVEL em arquitetura síncrona (ver "Por que ANTES" acima)
769
+
770
+ **Falha que isso PREVINE (caso real Allan stress test 03/05 18:43-18:53):**
771
+
772
+ Allan autorizou agente reinstalar Chromium fora do Snap. Agente rodou `process cool-atlas` e ficou silencioso. **10 minutos depois** Allan teve que perguntar "Wizard, está processando ainda?". Agente respondeu reportando status (gateway reiniciou + Chromium falhando por SingletonLock).
773
+
774
+ Se agente tivesse setado expectativa antes ("Vou reinstalar Chromium fora do Snap, leva ~3-5min, reinicia o Gateway"), Allan saberia que era pra esperar — não teria perguntado em 10min.
775
+
776
+ **Princípio meta:** o bug de UX não foi o tempo de execução (3-5min é razoável); foi o silêncio sem expectativa. Aluno em silêncio depois de "Working..." sem prazo concreto interpreta como "travou ou esqueceu de mim". Aviso prévio resolve.
777
+
778
+ ### Por que isso importa
779
+
780
+ - **Honestidade:** aluno SABE se algo deu certo de verdade. Não confia em afirmação cega
781
+ - **Debug:** quando algo dá errado, aluno tem o output real pra mostrar pro suporte
782
+ - **Educa:** aluno aprende o que cada comando faz vendo o output literal
783
+ - **Previne alucinação:** modelo LLM não consegue "inventar" output literal — ou roda de verdade ou não fala que rodou
784
+
785
+ ### Falhas que isso PREVINE (1 reportada, dezenas potenciais)
786
+
787
+ 1. **Áudio falso (Dr. Thiago, v1.9.1):** agente afirmou ter transcrito "Olá, tudo bem? É um teste de voz" mas aluno disse só "Oi tudo bem". Sem smoke test visível, alucinação passou.
788
+ 2. **Brew Ubuntu silencioso (potencial):** comando falha, agente segue como se tivesse instalado. Smoke test visível obriga mostrar erro.
789
+ 3. **Validação de chaves cego:** agente diz "validei" sem mostrar HTTP code. Pode estar usando chave revogada e não sabe.
790
+
791
+ ---
792
+
793
+ ## Princípio 15 — Mensagens canônicas são literais (não reformula, não "melhora")
794
+
795
+ ⚠️ **NOVO em v2.1.** Adicionado depois de feedbacks de aluno onde wizard-autonomia/workspace fizeram perguntas vagas que SKILL.md tinha como literal/precisas. Causa-raiz: agente "reformulou" pra parecer melhor, perdeu precisão.
796
+
797
+ **Regra:** trechos de SKILL.md marcados como `<canonical>...</canonical>` (ou em bloco de código com prefixo `# CANONICAL`) são pra ser USADOS LITERAL ao falar com aluno. Agente NÃO:
798
+
799
+ - Reformula a frase pra "ficar mais natural"
800
+ - Adapta o vocabulário "achando que melhorou"
801
+ - Substitui exemplos por outros que parecem equivalentes
802
+ - Encurta ou simplifica
803
+
804
+ **Exceção permitida:** ajustar TOM (formal/casual) seguindo `SOUL.md` do agente. Mas estrutura, ordem das opções, palavras-chave técnicas — preservar.
805
+
806
+ ### Marcação no SKILL.md
807
+
808
+ ```markdown
809
+ <canonical>
810
+ "Você quer me dar autonomia pra trabalhar:
811
+
812
+ 1. **Conservador** — eu sempre pergunto antes de fazer algo
813
+ 2. **Moderado** — eu executo direto coisas seguras (criar arquivo,
814
+ pesquisar), peço pra coisas sensíveis (deletar, instalar)
815
+ 3. **Avançado (yolo)** — eu executo direto e te aviso ao final
816
+
817
+ Manda 1, 2 ou 3."
818
+ </canonical>
819
+ ```
820
+
821
+ (Quando agente vê esse bloco, usa exato. Não inventa "vamo lá, qual nível de autonomia?".)
822
+
823
+ ### Por que importa
824
+
825
+ - **Pergunta-âncora precisa funcionar:** se autoria reformula a pergunta, perde a função pedagógica de fixar conhecimento
826
+ - **Termos técnicos consistentes:** aluno aprende vocabulário canônico se sempre vê o mesmo. Variação cria confusão ("yolo" vs "automático" vs "livre")
827
+ - **Anti-improviso:** agente já tem tendência de "melhorar" — Princípio 15 trava isso explicitamente
828
+
829
+ ### Aplica IMEDIATAMENTE em
830
+
831
+ - `wizard-autonomia`: 3 perfis (conservador/moderado/yolo) — usar literal quando implementado
832
+ - `wizard-workspace`: pergunta-âncora "post novo / decisão importante" — versão simplificada literal (a/b/c)
833
+ - `wizard-aluno`: bloco "como você se apresenta pra cliente novo" — usar literal
834
+ - `primeira-vitoria`: 4 opções pós-vitória + comandos de retomada — literal
835
+ - Pergunta-âncora de cada wizard (`mapa-aulas.md`) — sempre literal
836
+
837
+ ### Falhas que isso PREVINE (2 reportadas)
838
+
839
+ 1. **wizard-autonomia vago (Dr. Thiago):** agente perguntou "definir até onde posso agir sozinho" em vez do canônico. Bruno pediu perfis estruturados — Princípio 15 obriga usar literal quando implementado
840
+ 2. **wizard-workspace pergunta vaga:** agente fez pergunta-âncora aberta em vez do canônico estruturado
841
+
842
+ ---
843
+
844
+ ## Princípio 16 — Entry point literal (sem improvisar primeira mensagem)
845
+
846
+ ⚠️ **NOVO em v2.2.** Adicionado após feedback do tester NC (03/05/2026): agente recebeu zip do kit e respondeu *"Recebi o starter kit e dei uma olhada rápida [...] você quer que eu siga o wizard do kit ou prefere que eu proponha uma identidade inicial pra mim?"*. Causa-raiz: agente leu `0-LEIA-PRIMEIRO-AGENTE.md` + viu o kit, mas em vez de invocar `onboarding-checklist` IMEDIATAMENTE, criou escolha falsa (wizard formal vs improvisação disfarçada de "atalho conveniente").
847
+
848
+ **Regra:** quando agente detecta arquivos do kit no workspace (extração de zip OU presença de `0-LEIA-PRIMEIRO-AGENTE.md` + `skills/starter/onboarding-checklist/SKILL.md`), próxima ação OBRIGATÓRIA é:
849
+
850
+ 1. **Read** `skills/starter/onboarding-checklist/SKILL.md`
851
+ 2. **Renderizar literal** a seção "Boas-vindas universal" desse arquivo (P15 aplicado ao entry point)
852
+ 3. Seguir o fluxo canonical SEM perguntar nada antes
853
+
854
+ **O que P16 PROIBE:**
855
+
856
+ - ❌ "Recebi o kit, dei uma olhada rápida..." — preâmbulo zero. Mensagem inicial = boas-vindas canonical
857
+ - ❌ "Posso usar isso como base pra nossa configuração inicial" — sem narrar antes do design despachar
858
+ - ❌ "Você quer que eu siga o wizard, ou prefere que eu proponha identidade inicial?" (NC, 03/05) — escolha falsa, ambas precisam vir via onboarding-checklist
859
+ - ❌ "Antes de começar, qual seu nome?" — wizard-aluno faz isso na ordem certa, não o entry point
860
+ - ❌ "Vamos por etapas: primeiro vou..." — entry point não tem etapas próprias
861
+ - ❌ Modificar arquivos raiz (IDENTITY, USER, SOUL, AGENTS) ANTES da onboarding-checklist despachar wizards específicos
862
+
863
+ **O que P16 PERMITE:**
864
+
865
+ - ✅ Invocar `onboarding-checklist` IMEDIATAMENTE
866
+ - ✅ Pedir esclarecimento à `0-LEIA-PRIMEIRO-AGENTE.md` se algo no design não bater (Princípio 7 — em dúvida, perguntar... a si mesmo, não ao aluno)
867
+ - ✅ Reusar dados do contexto existente DENTRO dos wizards (P11 — detectar antes de pedir), mas não ANTES de invocar a checklist
868
+
869
+ ### Padrão correto
870
+
871
+ Aluno entrega zip → agente extrai (se ainda não) → agente Read onboarding-checklist → agente renderiza:
872
+
873
+ ```
874
+ "Oi! 👋
875
+
876
+ Eu sou {nome_agente}. Acabei de receber o **Starter Kit OpenClaw v{X.Y}** —
877
+ um experimento da **Pixel Educação** (mini-curso OpenClaw), feito pelo
878
+ **Bruno Okamoto**.
879
+
880
+ [resto da boas-vindas canonical...]"
881
+ ```
882
+
883
+ Aluno tá no Telegram, vê isso, sabe que entrou no fluxo. Sem ambiguidade.
884
+
885
+ ### Padrão INCORRETO (caso real NC, 03/05/2026)
886
+
887
+ ```
888
+ "Recebi o starter kit e dei uma olhada rápida: tem instruções, templates de
889
+ identidade/SOUL/USER, exemplos e skills.
890
+
891
+ Posso usar isso como base pra nossa configuração inicial. Mas antes preciso
892
+ de uma escolha tua: você quer que eu siga o wizard do kit e vá te perguntando
893
+ passo a passo, ou prefere que eu proponha uma identidade inicial pra mim e
894
+ você só ajusta?"
895
+ ```
896
+
897
+ (Escolha falsa + improvisação disfarçada de polidez. A 2ª opção quebra Princípio 1: modificar arquivo raiz sem backup nem confirmação contextualizada.)
898
+
899
+ ### Aplica IMEDIATAMENTE em
900
+
901
+ - `0-LEIA-PRIMEIRO-AGENTE.md`: documento explícito com lista de improvisações proibidas, casos reais
902
+ - `README.md`: bloco "Princípio 16" + lista de improvisações observadas no topo
903
+ - `onboarding-checklist`: a "Boas-vindas universal" passa a ser explicitamente CANONICAL (P15 reforçado)
904
+ - `wizard-agente` + `wizard-aluno`: bloco anti-presunção — não pré-preencher arquivos baseados em "intuição" antes da entrevista canonical
905
+
906
+ ### Por que isso importa
907
+
908
+ - **Primeira impressão do aluno:** ele entrega zip esperando "agente vira tutor". Se primeira mensagem é "que caminho você prefere?", quebra a tese do kit
909
+ - **Cura na camada anterior:** P13/14/15 protegem DENTRO dos wizards. P16 protege ANTES de invocar wizard nenhum — agente esperto sempre acha um jeito de "consultar antes" se não for proibido explicitamente
910
+ - **Pega 5 sub-padrões num só:** preâmbulo / escolha falsa / proposta proativa / pergunta de identidade prévia / "configuração inicial" como conceito improvisado
911
+
912
+ ### Falhas que isso PREVINE (1 reportada, vários potenciais)
913
+
914
+ 1. **NC (03/05/2026):** agente respondeu zip com "wizard ou eu proponho identidade?" — escolha falsa onde a 2ª opção quebra Princípio 1
915
+ 2. **Potencial:** agente que "interpreta intenção" do aluno antes de invocar checklist — vira "consultar" o aluno sobre como instalar
916
+ 3. **Potencial:** agente que renderiza versão "resumida" da boas-vindas em vez da canonical — perde posicionamento Pixel + tom
917
+ 4. **Potencial:** agente que usa contexto de conversa anterior pra pré-preencher USER/IDENTITY antes do wizard — quebra P11 + P1
918
+
919
+ ---
920
+
921
+ ## Princípio 17 — Formatação Telegram-friendly em mensagens canonical
922
+
923
+ ⚠️ **NOVO em v2.2 (final).** Adicionado após feedback do tester **Adrylan Viana** (03/05/2026 tarde): a boas-vindas universal apareceu com hard-breaks visíveis no Telegram desktop ("os textos ficam quebrados, tem como melhorar isso?" + screenshot do agente do NC mostrando frases cortadas no meio). Causa-raiz: mensagens canonical em SKILL.md foram escritas com quebras manuais a cada ~70 chars (estilo "leitura no editor markdown"). Telegram (e WhatsApp, Slack, email) **preservam quebras hard** mesmo em telas mais largas que a quebra original — vira aparência de texto cortado.
924
+
925
+ **Regra:** TODA mensagem canonical destinada ao aluno via plataforma com word-wrap automático (Telegram, WhatsApp, Slack, email) deve seguir:
926
+
927
+ 1. **Parágrafos contínuos.** 1 linha por parágrafo, sem quebras manuais no meio. Plataforma quebra naturalmente conforme largura da tela
928
+ 2. **Separação por linha em branco.** `\n\n` entre parágrafos = visual limpo
929
+ 3. **Listas explícitas.** Itens começando com `-`, `*`, `•` ou números (`1.`, `2.`) — quebras nesses casos são intencionais e preservam OK
930
+ 4. **Code blocks pra comandos / URLs específicos.** Texto pra aluno COPIAR vai entre triple-backticks — Telegram renderiza monospace + tap-pra-copiar
931
+ 5. **Bold / italic moderado.** Markdown nativo: `**bold**` e `*italic*` — usar pra ênfase semântica, não decoração
932
+
933
+ **O que P17 PROIBE:**
934
+
935
+ - ❌ Quebrar parágrafos a cada ~70 chars achando que "fica mais legível no editor". O editor não é o destino — o Telegram é.
936
+ - ❌ Usar `<br>`, `<br/>` ou tags HTML — Telegram trata como texto literal
937
+ - ❌ Múltiplos espaços pra "alinhar" texto — Telegram colapsa whitespace
938
+ - ❌ Tabs pra indentação — não preservam consistente entre clientes
939
+ - ❌ Listas com bullets virados pra direita ou caracteres exóticos (`›`, `»`) — usar `-` ou `•` simples
940
+
941
+ ### Padrão correto (boas-vindas reformatada)
942
+
943
+ ```
944
+ "Oi! 👋
945
+
946
+ Eu sou {nome_agente}. Acabei de receber o **Starter Kit OpenClaw v{X.Y}** — um experimento da **Pixel Educação** (mini-curso OpenClaw), feito pelo **Bruno Okamoto**.
947
+
948
+ 🧪 **Em fase EXPERIMENTAL.** É o primeiro experimento da Pixel onde o conteúdo do mini-curso roda DENTRO do agente do aluno. Cada skill foi escrita pra ser:
949
+
950
+ - Lida e executada por outro agente (eu)
951
+ - Compreensível por humano que olha por cima (você)
952
+
953
+ A tese: em vez de você ler manual e configurar tudo na mão, **eu sou seu tutor**. Te guio passo a passo, executo o que dá pra executar, te explico o por quê.
954
+
955
+ Esse é um curso pra **dois tipos de aluno: humanos E agentes**. Você é o humano, eu sou o agente, a gente faz isso juntos.
956
+
957
+ Heads up: tá em **testes ativos**. Se algo soar estranho, manda direto pro Bruno: bruno@microsaas.com.br (ele lê pessoalmente). Comunidade no Telegram: https://t.me/cursoopenclaw
958
+
959
+ Agora deixa eu olhar o que tem aqui no seu workspace pra escolher o melhor caminho..."
960
+ ```
961
+
962
+ Cada parágrafo é UMA linha contínua. Telegram word-wrap natural conforme largura.
963
+
964
+ ### Padrão INCORRETO (caso real Adrylan, 03/05/2026)
965
+
966
+ ```
967
+ "Eu sou seu agente. Acabei de receber o **Starter Kit OpenClaw v2** —
968
+ um experimento da **Pixel Educação** (mini-curso OpenClaw), feito pelo
969
+ **Bruno Okamoto**.
970
+
971
+ 🧪 **Em fase EXPERIMENTAL.** É o primeiro experimento da Pixel onde o
972
+ conteúdo do mini-curso roda DENTRO do agente do aluno..."
973
+ ```
974
+
975
+ Quebras hard a cada ~70 chars preservam no Telegram desktop. Vira aparência de texto cortado.
976
+
977
+ ### Aplica IMEDIATAMENTE em (12 SKILL.md)
978
+
979
+ - `onboarding-checklist`: boas-vindas universal + Cenário B 3 caminhos + cancelamento
980
+ - `wizard-agente`, `wizard-aluno`, `wizard-autonomia`, `wizard-workspace`, `wizard-conectar`, `wizard-whisper-quick`, `primeira-vitoria`: pergunta-âncora + opções literais + mensagem-fim
981
+ - `continuar-jornada`: opções de retomada
982
+ - `gera-log-jornada`: convite + caminhos de envio
983
+ - `cron-resume-wizards` (operacional/): 3 DMs canonical
984
+ - `wizard-whatsapp` (canais/): opcional pós-vitória
985
+
986
+ ### Por que isso importa
987
+
988
+ - **Primeira impressão visível.** Aluno em desktop/tablet lê texto cortado. Mesmo que P1, P11, P15 estejam corretos, percepção de qualidade despenca
989
+ - **P15 era textual, P17 é visual.** P15 garante palavra certa; P17 garante VISUAL certo
990
+ - **Quebra é só um dos problemas potenciais.** Princípio cobre 5 fontes de erro visual (hard-break, br tag, espaços, tabs, formatação inconsistente)
991
+ - **Categoria diferente das anteriores.** P13/14/15 são sobre LÓGICA/conteúdo; P17 é sobre RENDERIZAÇÃO
992
+
993
+ ### Como testar (validação manual)
994
+
995
+ 1. Mensagem canonical pronta? Cola no Telegram desktop (largura ~1200px)
996
+ 2. Vê quebras estranhas no meio de frases? → reescreve os parágrafos como linhas contínuas
997
+ 3. Cola no celular (largura ~400px) também — confirma que continua legível em ambos
998
+ 4. Repete pra: WhatsApp, Slack (se aplicável)
999
+
1000
+ ### Falhas que isso PREVINE (1 reportada, vários potenciais)
1001
+
1002
+ 1. **Adrylan (03/05/2026 tarde):** "@obrunookamoto os textos ficam quebrados, tem como melhorar isso?" + screenshot da boas-vindas com hard-breaks visíveis em Telegram desktop
1003
+ 2. **Potencial:** mensagens longas em outros wizards quebrando em telas largas — Lia/Mira/Dr. Thiago testaram em celular onde a quebra hard coincidiu com largura natural
1004
+ 3. **Potencial:** outros canais (WhatsApp Business, Slack threads, email) que fazem word-wrap automático com regras diferentes do Telegram
1005
+ 4. **Potencial:** futuras skills das aulas do mini-curso (Aulas 5+) herdando o mesmo erro de formatação se ninguém formalizou a regra
1006
+
1007
+ ---
1008
+
1009
+ ## Princípio 18 — Material do curso como fonte de verdade (não improvisa) (kit v2.5.4)
1010
+
1011
+ **Regra:** Quando aluno menciona aula ou tema do mini-curso, agente consulta `$WORKSPACE/_curso/INDICE.md` + carrega trecho relevante de `_curso/aulas/aula-XX-tema.html`. NÃO improvisa do treino geral.
1012
+
1013
+ Detalhes completos em `0-LEIA-PRIMEIRO-AGENTE.md` (seção "Quando aluno mencionar aula ou tema do curso").
1014
+
1015
+ ---
1016
+
1017
+ ## Princípio 19 — Estagnação suave do wizard (kit v2.5.6)
1018
+
1019
+ **Regra:** Se aluno está com `active_wizard != null` E `last_wizard_advance_at < now() - 25min` E `last_user_message_at > now() - 5min` (= aluno tá ATIVO no chat mas não avança no wizard), agente faz **UMA** intervenção sutil — não em cada turno, não com menu rígido. Tom humano. Aluno escolhe sem pressão.
1020
+
1021
+ ### Por que existe
1022
+
1023
+ P13 (Guard Rail) conta desvios consecutivos. Mas aluno pode fazer 2 desvios → 1 retorno curto → 2 desvios infinito, resetando contador sem avançar. Wizard "morre" durante a sessão sem o agente perceber.
1024
+
1025
+ P19 conta **tempo desde último avanço REAL no wizard**, não desvios.
1026
+
1027
+ ### Como funciona
1028
+
1029
+ Cada wizard escreve em `MEMORY.md` ao avançar passo:
1030
+ ```yaml
1031
+ active_wizard: wizard-agente
1032
+ active_step: 2
1033
+ last_wizard_advance_at: 2026-05-07T14:32:00-03:00
1034
+ last_user_message_at: 2026-05-07T14:48:12-03:00
1035
+ ```
1036
+
1037
+ **Estados detectados:**
1038
+
1039
+ | Estado | Condição | Comportamento |
1040
+ |---|---|---|
1041
+ | 🟢 Avançando | last_wizard_advance < 25min | Normal — agente segue conversa livre |
1042
+ | 🟡 Estagnado (uma vez) | last_wizard_advance >= 25min E aluno ativo no chat E `nudge_enviado != true` | Header sutil + oferta humana (UMA vez) · seta `nudge_enviado: true` |
1043
+ | 🟢 Reset | aluno avançou OU usou comando `silencia wizard` | Limpa `nudge_enviado`, volta pra normal |
1044
+
1045
+ ### Mensagem canonical do estado 🟡 (uma vez por estagnação)
1046
+
1047
+ ```
1048
+ [resposta normal à última mensagem do aluno — conteúdo livre]
1049
+
1050
+ ---
1051
+ ei, eu tava te ajudando com o **wizard {nome}** ({passo}/{total}) — faz uns
1052
+ {N} minutos que não avançamos. Sem pressão: posso continuar conversando
1053
+ sobre o que você tá perguntando agora E você volta pro wizard quando
1054
+ quiser, ou se preferir a gente fecha o wizard primeiro. Você decide.
1055
+
1056
+ (se quiser desligar esses lembretes: manda `silencia wizard`)
1057
+ ```
1058
+
1059
+ **Tom:** humano, primeira pessoa, sem menu a/b/c, sem cobrança. NÃO repetir em turnos seguintes — uma vez basta. Se aluno responde sem voltar pro wizard, agente segue normalmente sem reforçar.
1060
+
1061
+ ### Reset do nudge
1062
+
1063
+ Limpa `nudge_enviado: false` quando:
1064
+ - Aluno avança no wizard (`last_wizard_advance_at` atualiza)
1065
+ - Aluno usa `silencia wizard` (P13 — comando canonical novo)
1066
+ - Aluno usa `cancela` ou `pula` (pause/cancel explícito)
1067
+
1068
+ ### Cobertura combinada com cron-resume
1069
+
1070
+ P19 cobre escala MINUTOS (aluno ativo no chat, wizard estagnado).
1071
+ `cron-resume-wizards` cobre escala DIAS (aluno saiu, retorna depois).
1072
+
1073
+ Não sobrepõem.
1074
+
1075
+ ### Falhas que isso PREVINE
1076
+
1077
+ - **Loop infinito do P13:** aluno desvia 2x → retorna 1x curto → desvia 2x → retorna 1x curto → wizard nunca avança, mas P13 nunca acumula 3 desvios consecutivos. P19 detecta porque conta tempo, não desvios.
1078
+ - **Aluno que esquece silenciosamente:** entrou no wizard às 14h, são 14:35, ele tá conversando sobre Notion e nem lembra mais que tava no passo 2. Header gentil traz de volta sem cobrar.
1079
+
308
1080
  ---
309
1081
 
310
1082
  ## Princípio 12 — Mapas distribuídos (cada pasta documenta a si mesma)