KVMote/.claude/napkin.md

44 lines
2.3 KiB
Markdown

# Napkin Runbook — KVMote
## Curation Rules
- Re-prioritize on every read.
- Keep recurring, high-value notes only.
- Max 10 items per category.
- Each item includes date + "Do instead".
## Execution & Validation (Highest Priority)
1. **[2026-03-24] `ImplicitUsings=disable` — todo using deve ser explícito**
Do instead: ao adicionar código, verificar se todos os namespaces usados têm `using` explícito no topo. Faltou um → erro CS0103 silencioso em runtime.
2. **[2026-03-24] Designer file: sempre usar `this.` nos membros de Form**
Do instead: em `Principal.Designer.cs`, escrever `this.btnConnect.Text = ...` — nunca omitir `this.`. Sem isso → CS0103.
3. **[2026-03-24] AutoScaleMode deve ser `Dpi` com `AutoScaleDimensions = new SizeF(96F, 96F)`**
Do instead: nunca usar `None` (quebra DPI alto) nem `Font` (escala diferente por máquina).
4. **[2026-03-24] Form1.cs / Form1.Designer.cs são stubs vazios — não remover**
Do instead: manter como `namespace KVMote { }`. VS os inclui no .csproj; remover do disco pode causar erro de build.
## Build & Deploy
1. **[2026-03-24] Não usar "Publicar" do Visual Studio — gera ClickOnce (múltiplos arquivos)**
Do instead: usar `dotnet publish -c Release -r win-x64 --self-contained true -p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true` no terminal.
## Domain Behavior Guardrails
1. **[2026-03-24] Canal serial é único (9600 baud) — mouse trava durante paste de clipboard**
Do instead: isso é design proposital (limitação do BT HC-06). Não tentar paralelizar sem mudar o protocolo de transporte.
2. **[2026-03-24] Chars não-ASCII (é, ã, ç) não são enviáveis via clipboard**
Do instead: filtrar/ignorar na `SendClipboardToClient`. Limite: `MaxClipChars = 300`.
3. **[2026-03-24] `ClipCursor` não é usado para prender o cursor em modo cliente**
Do instead: usar técnica FPS warp — `SetCursorPos` de volta ao centro a cada WM_MOUSEMOVE, acumulando deltas reais em `_pendingDX/_pendingDY`.
4. **[2026-03-24] `SendMouse` usa `Monitor.TryEnter` (lossy) — descarta pacotes se canal ocupado**
Do instead: isso é intencional. Não trocar por `lock` pois bloquearia o hook de mouse.
5. **[2026-03-24] Arduino Leonardo é obrigatório — Uno não suporta HID USB nativo**
Do instead: nunca sugerir Arduino Uno ou Mega como substituto.