44 lines
2.3 KiB
Markdown
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.
|