Design doc covers architecture, v2 protocol (TypedValue/QualityCode), COM threading model, session lifecycle, subscription semantics, error model, and guardrails. Implementation plans are detailed enough for autonomous Claude Code execution. Verified all dev tooling on windev (Grpc.Tools, protobuf-net.Grpc, Polly v8, xUnit).
7.8 KiB
WinDev — Windows Development VM
Remote Windows 10 VM used for development and testing.
- ESXi host: See esxi.md — VM name
WW_DEV_VMon ESXi 8.0.3 at 10.2.0.12 - Backup: See veeam.md — Veeam B&R 12.3 at 10.100.0.30. Dedicated job "Backup WW_DEV_VM" targeting NAS repo. First restore point (2026-03-21) = Baseline: Win10 + .NET 10 SDK + .NET Fx 4.8 + Git + 7-Zip + Chrome + Claude Code + csharp-ls.
Connection Details
| Field | Value |
|---|---|
| Hostname | DESKTOP-6JL3KKO |
| IP | 10.100.0.48 |
| OS | Windows 10 Enterprise (10.0.19045), 64-bit |
| CPU | Intel Xeon E5-2697 v4 @ 2.30GHz |
| RAM | ~12 GB |
| Disk | C: 235 GB free / 256 GB total |
| User | dohertj2 (local administrator) |
| SSH | OpenSSH Server (passwordless via ed25519 key) |
| Default shell | cmd.exe |
SSH Access
Passwordless SSH is configured. An alias windev is set up in ~/.ssh/config.
# Connect
ssh windev
# Run a command
ssh windev "hostname"
# Run PowerShell
ssh windev "powershell -Command \"Get-Process\""
SSH Config Entry (~/.ssh/config)
Host windev
HostName 10.100.0.48
User dohertj2
IdentityFile ~/.ssh/id_ed25519
How Passwordless Auth Works
Since dohertj2 is in the local Administrators group, Windows OpenSSH uses a special authorized keys file instead of the per-user ~/.ssh/authorized_keys:
C:\ProgramData\ssh\administrators_authorized_keys
This is configured in C:\ProgramData\ssh\sshd_config via the Match Group administrators block. If you need to add another key, append it to that file and ensure ACLs are correct:
icacls C:\ProgramData\ssh\administrators_authorized_keys /inheritance:r /grant "Administrators:F" /grant "SYSTEM:F"
File Transfer
# Copy file to Windows
scp localfile.txt windev:C:/Users/dohertj2/Desktop/
# Copy file from Windows
scp windev:C:/Users/dohertj2/Desktop/file.txt ./
# Copy directory recursively
scp -r ./mydir windev:C:/Users/dohertj2/Desktop/mydir
Running Commands
The default shell is cmd.exe. For PowerShell, prefix commands explicitly.
# cmd (default)
ssh windev "dir C:\Users\dohertj2"
# PowerShell
ssh windev "powershell -Command \"Get-Service | Where-Object { \$_.Status -eq 'Running' }\""
# Multi-line PowerShell script
ssh windev "powershell -File C:\scripts\myscript.ps1"
Service Management
# List services
ssh windev "sc query state= all"
# Start/stop a service
ssh windev "sc stop ServiceName"
ssh windev "sc start ServiceName"
# Check a specific service
ssh windev "sc query ServiceName"
Process Management
# List processes
ssh windev "tasklist"
# Kill a process
ssh windev "taskkill /F /PID 1234"
ssh windev "taskkill /F /IM process.exe"
Installed Software
Package Manager
| Tool | Version | Install Path |
|---|---|---|
| winget | v1.28.190 | AppX package |
The msstore source has been removed (requires interactive agreement acceptance). Only the winget community source is configured. To install packages:
ssh windev "winget install --id <PackageId> --silent --disable-interactivity"
Development Tools
| Tool | Version | Install Path |
|---|---|---|
| 7-Zip | 26.00 (x64) | C:\Program Files\7-Zip\ |
| .NET Framework | 4.8.1 (Developer Pack) | GAC / Reference Assemblies (v4.8.1 ref assemblies present) |
| .NET SDK | 10.0.201 | C:\Program Files\dotnet\ |
| .NET Runtime | 10.0.5 (Core + ASP.NET + Desktop) | C:\Program Files\dotnet\ |
| Git | 2.53.0.2 | C:\Program Files\Git\ |
| Claude Code | 2.1.81 | C:\Users\dohertj2\.local\bin\claude.exe |
Launch with cc alias (cmd or Git Bash) which runs claude --dangerously-skip-permissions --chrome.
C# LSP — csharp-ls v0.22.0 installed as dotnet global tool (C:\Users\dohertj2\.dotnet\tools\csharp-ls.exe). Configured via the csharp-lsp@claude-plugins-official plugin. Provides goToDefinition, findReferences, hover, documentSymbol, workspaceSymbol, goToImplementation, and call hierarchy operations on .cs files. First invocation in a session is slow (~1-2 min) while the solution loads.
Git is configured with credential.helper=store (not GCM — the bundled Git Credential Manager was removed from system config to avoid OAuth/tty issues over SSH). Credentials are stored in C:\Users\dohertj2\.git-credentials.
Gitea (gitea.dohertylan.com) is pre-authenticated — no login prompts. Clone repos with:
ssh windev "git clone https://gitea.dohertylan.com/dohertj2/<repo>.git C:\src\<repo>"
Applications
| App | Version | Default For |
|---|---|---|
| Google Chrome | 146.0.7680.154 | HTTP, HTTPS, .htm, .html, .pdf |
| Notepad++ | 8.9.2 | — |
Defaults set via Group Policy DefaultAssociationsConfiguration pointing to C:\Windows\System32\DefaultAssociations.xml.
Not Installed
- Git —
winget install Git.Git - Python —
winget install Python.Python.3.12 - Visual Studio —
winget install Microsoft.VisualStudio.2022.BuildTools
Network
Single network interface:
| Interface | IP |
|---|---|
| Ethernet0 | 10.100.0.48 (static) |
Other Users with SSH Access
The sshus user also has passwordless SSH access (used for LmxProxy operations). See lmxproxy_protocol.md for details on the LmxProxy service running on this machine.
Backup (Veeam)
Veeam job "Backup WW_DEV_VM" on the Veeam server (10.100.0.30). Targets the NAS repo (nfs41://10.50.0.25:/mnt/mypool/veeam).
# Incremental backup (changed blocks only)
ssh dohertj2@10.100.0.30 "powershell -Command \"Add-PSSnapin VeeamPSSnapin; Connect-VBRServer -Server localhost; Start-VBRJob -Job (Get-VBRJob -Name 'Backup WW_DEV_VM')\""
# Full backup
ssh dohertj2@10.100.0.30 "powershell -Command \"Add-PSSnapin VeeamPSSnapin; Connect-VBRServer -Server localhost; Start-VBRJob -Job (Get-VBRJob -Name 'Backup WW_DEV_VM') -FullBackup\""
# Check status
ssh dohertj2@10.100.0.30 "powershell -Command \"Add-PSSnapin VeeamPSSnapin; Connect-VBRServer -Server localhost; (Get-VBRJob -Name 'Backup WW_DEV_VM').FindLastSession() | Select-Object State, Result, CreationTime, EndTime\""
# List restore points
ssh dohertj2@10.100.0.30 "powershell -Command \"Add-PSSnapin VeeamPSSnapin; Connect-VBRServer -Server localhost; Get-VBRRestorePoint -Backup (Get-VBRBackup -Name 'Backup WW_DEV_VM') | Select-Object CreationTime, Type, @{N='SizeGB';E={[math]::Round(\`$_.ApproxSize/1GB,2)}} | Format-Table -AutoSize\""
Restore Points
| ID | Date | Type | Notes |
|---|---|---|---|
f2cd44a9 |
2026-03-21 14:28 | Full | Baseline — Win10 + .NET 10 SDK + .NET Fx 4.8 + Git + 7-Zip + Chrome + Claude Code + csharp-ls (old UUID) |
2879a744 |
2026-03-21 15:15 | Increment | UUID fixed to 1BFC4D56-8DFA-A897-D1E4-BF1FD7F0096C, static IP 10.100.0.48 |
b4e87cfe |
2026-03-21 16:43 | Increment | Pre-licensing — Notepad++ added, firewall/Defender disabled, licensing backups staged |
f38a8aed |
2026-03-21 17:01 | Increment | Post-licensing — WPS2020 licensing applied and verified working |
Troubleshooting
"Permission denied" on SSH key auth
Windows OpenSSH is strict about file permissions on administrators_authorized_keys. Re-run:
icacls C:\ProgramData\ssh\administrators_authorized_keys /inheritance:r /grant "Administrators:F" /grant "SYSTEM:F"
Host key changed error
If the VM is rebuilt, clear the old key:
ssh-keygen -R 10.100.0.48
Firewall blocking SSH
If the VM becomes unreachable, RDP in and check Windows Firewall or disable it:
Set-NetFirewallProfile -Profile Domain,Public,Private -Enabled False