OPEN SOURCE · ISSUES · REPRODUCTIONS · PRS
OPEN SOURCE.
Bugs I reported, traced, or fixed in public projects. Each row links to the issue, comment, or PR on GitHub.
Ordered by impact: reach, outcome, severity, and evidence, scored 0–9.
Upstream: OpenClaw, Codex, Claude Code, OpenCode 19
OpenClaw 1
Why this row links to archives: github.com/openclaw/openclaw.ai returns 404 since mid-2026, and GitHub hid its PRs with it. Four independent records show the merge:
| GH Archive (public log of all GitHub events) | th3nolo opens PR #85 on openclaw/openclaw.ai from branch fix/windows-install-minimal-v3 | |
| Software Heritage (permanent source-code archive) | main gets commit bfc0bd9 "fix(installer): consolidate windows install reliability (#85)", author th3nolo, committer GitHub (squash merge). Its install.ps1 is byte-identical to my commit 5c47d98; the commit before it has none of the three functions. | |
| Wayback Machine | snapshot of openclaw/openclaw.ai PR #84, the round before #85 | |
| openclaw.ai/install.ps1 (live) | the three functions still run, compared line by line below |
Compare my commit with the live installer
Left: public/install.ps1 in merge commit bfc0bd9 (2026-03-02), from the Software Heritage copy; it is the same file as my commit 5c47d98. Right: the file served at openclaw.ai/install.ps1, fetched 2026-09-28 04:18 UTC. = marks a line that is the same in both files. + marks a line OpenClaw added later.
| PR #85 as merged (bfc0bd9) · lines 182–197 | Match | Live openclaw.ai/install.ps1 · lines 1209–1224 | ||
|---|---|---|---|---|
| 182 | function Get-NpmGlobalBinCandidates { | same line | 1209 | function Get-NpmGlobalBinCandidates { |
| 183 | param( | same line | 1210 | param( |
| 184 | [string]$NpmPrefix | same line | 1211 | [string]$NpmPrefix |
| 185 | ) | same line | 1212 | ) |
| 186 | same line | 1213 | ||
| 187 | $candidates = @() | same line | 1214 | $candidates = @() |
| 188 | if (-not [string]::IsNullOrWhiteSpace($NpmPrefix)) { | same line | 1215 | if (-not [string]::IsNullOrWhiteSpace($NpmPrefix)) { |
| 189 | $candidates += $NpmPrefix | same line | 1216 | $candidates += $NpmPrefix |
| 190 | $candidates += (Join-Path $NpmPrefix "bin") | same line | 1217 | $candidates += (Join-Path $NpmPrefix "bin") |
| 191 | } | same line | 1218 | } |
| 192 | if (-not [string]::IsNullOrWhiteSpace($env:APPDATA)) { | same line | 1219 | if (-not [string]::IsNullOrWhiteSpace($env:APPDATA)) { |
| 193 | $candidates += (Join-Path $env:APPDATA "npm") | same line | 1220 | $candidates += (Join-Path $env:APPDATA "npm") |
| 194 | } | same line | 1221 | } |
| 195 | same line | 1222 | ||
| 196 | return $candidates | Where-Object { -not [string]::IsNullOrWhiteSpace($_) } | Select-Object -Unique | same line | 1223 | return $candidates | Where-Object { -not [string]::IsNullOrWhiteSpace($_) } | Select-Object -Unique |
| 197 | } | same line | 1224 | } |
| PR #85 as merged (bfc0bd9) · lines 154–166 | Match | Live openclaw.ai/install.ps1 · lines 1082–1094 | ||
|---|---|---|---|---|
| 154 | function Get-OpenClawCommandPath { | same line | 1082 | function Get-OpenClawCommandPath { |
| 155 | $openclawCmd = Get-Command openclaw.cmd -ErrorAction SilentlyContinue | same line | 1083 | $openclawCmd = Get-Command openclaw.cmd -ErrorAction SilentlyContinue |
| 156 | if ($openclawCmd -and $openclawCmd.Source) { | same line | 1084 | if ($openclawCmd -and $openclawCmd.Source) { |
| 157 | return $openclawCmd.Source | same line | 1085 | return $openclawCmd.Source |
| 158 | } | same line | 1086 | } |
| 159 | same line | 1087 | ||
| 160 | $openclaw = Get-Command openclaw -ErrorAction SilentlyContinue | same line | 1088 | $openclaw = Get-Command openclaw -ErrorAction SilentlyContinue |
| 161 | if ($openclaw -and $openclaw.Source) { | same line | 1089 | if ($openclaw -and $openclaw.Source) { |
| 162 | return $openclaw.Source | same line | 1090 | return $openclaw.Source |
| 163 | } | same line | 1091 | } |
| 164 | same line | 1092 | ||
| 165 | return $null | same line | 1093 | return $null |
| 166 | } | same line | 1094 | } |
| PR #85 as merged (bfc0bd9) · lines 168–180 | Match | Live openclaw.ai/install.ps1 · lines 1096–1112 | ||
|---|---|---|---|---|
| 168 | function Invoke-OpenClawCommand { | same line | 1096 | function Invoke-OpenClawCommand { |
| 169 | param( | same line | 1097 | param( |
| 170 | [Parameter(ValueFromRemainingArguments = $true)] | same line | 1098 | [Parameter(ValueFromRemainingArguments = $true)] |
| 171 | [string[]]$Arguments | same line | 1099 | [string[]]$Arguments |
| 172 | ) | same line | 1100 | ) |
| 173 | same line | 1101 | ||
| 174 | $commandPath = Get-OpenClawCommandPath | same line | 1102 | $commandPath = Get-OpenClawCommandPath |
| 175 | if (-not $commandPath) { | same line | 1103 | if (-not $commandPath) { |
| 176 | throw "openclaw command not found on PATH." | same line | 1104 | throw "openclaw command not found on PATH." |
| 177 | } | same line | 1105 | } |
| 178 | same line | 1106 | ||
| 179 | & $commandPath @Arguments | same line | 1107 | & $commandPath @Arguments |
| added later | 1108 | $exitCode = $LASTEXITCODE | ||
| added later | 1109 | if ($exitCode -ne 0) { | ||
| added later | 1110 | throw "openclaw $($Arguments -join ' ') failed with exit code $exitCode." | ||
| added later | 1111 | } | ||
| 180 | } | same line | 1112 | } |
Check it yourself:
curl -s https://openclaw.ai/install.ps1 | grep -n "^function Get-NpmGlobalBinCandidates\|^function Get-OpenClawCommandPath\|^function Invoke-OpenClawCommand"
Codex 13
Claude Code 3
OpenCode 2
Blockchain 4
Compare my PR with the repo today
| PR #2 diff · flow/config.js | Match | main today · flow/config.js | ||
|---|---|---|---|---|
| 7 | + "discovery.authn.include": ["0x9d2e44203cb13051", "0x82ec283f88a62e65"], | same line | 7 | "discovery.authn.include": ["0x9d2e44203cb13051", "0x82ec283f88a62e65"], |
This line turns on Dapper and Ledger sign-in in Flow's wallet picker. My commit d087e08 is still the last change to this file.