Development record
scanner githubRemoteRe is case-sensitive on the github.com host, disabling the github_username detector on a mixed-case remote and spuriously hard-failing when name==handle
scanner githubRemoteRe is case-sensitive on the github.com host, disabling the github_username detector on a mixed-case remote and spuriously hard-failing when name==handle
Evidence
internal/adapter/scanner/identity.go:94 — githubRemoteRe compiles the pattern github\.com[:/]([A-Za-z0-9-]+)/, which has no (?i). git stores remote.origin.url byte-verbatim, so git@GitHub.com:Eve/repo.git or https://GITHUB.COM/... yields an empty capture. ProbeIdentity (:56-73) then leaves GitRemoteUsername empty, m.github (:160) is never compiled, and the github_username warn detector is silently disabled for that checkout.
The neighbouring matchers m.homeSelf/m.email/m.name/m.github and both noreply regexes all carry (?i) with comments naming this exact case-fold reason — the extractor feeding them is the missed site.
Adversarial verdict: CONFIRMED (substantive-low)
Reproduced end-to-end through the real ProbeIdentity/ScanText: mixed-case remote → 0 findings vs lowercase → 1. Second consequence: the empty username also flips the first arm of m.nameEqGithub (:168), producing a spurious real_name hard_fail ship-blocker when user.name equals the handle and the email is non-noreply — partially re-opening resolved iss-283. Fix: add (?i) to githubRemoteRe. FP impact nil — the regex's only input is remote.origin.url, never committed text; downstream strings.EqualFold/(?i) make captured case irrelevant. Not prior art: the (?i) sweep provenance names m.email/m.github/m.homeSelf, never githubRemoteRe.
Frontmatter
| id | iss-306 |
|---|---|
| type | issue |
| lifecycle | resolved |
| severity | minor |
.abcd/work/issues/resolved/iss-306-scanner-githubremotere-is-case-sensitive.md
open on GitHub ↗ · commit history ↗
mentions3
- dcn-26082000000000032026-08-20 — Bug-hunt round 1 (hunt A), landed late: the round ran 2026-08-19 on a branch that
- iss-283The real_name suppression breaks on an org-owned remote: newIdentityMatchers suppresses real_name only when git user.name equals the username parsed from remote.origin.url, so transferring the repo to an organisation (remote owner Partnermedia, user.name set to the product thinker's login) turns the caller's public GitHub handle into 13 hard_fail findings and blocks the launch. The noreply email (id+login@users.noreply.github.com) carries the caller's login locally and is the right second source for the suppression
- iss-344Parallel hunts capture the same defect twice: iss-306 (hunt A round 1, landed late) and iss-339 (hunt B round 2) record the identical githubRemoteRe case-sensitivity bug, minted independently on unmerged branches invisible to each other. Collision-proof ids (itd-114) do not solve this class — it is the semantic sibling of the id collision, sharing the root cause that parallel minters cannot see each other's unmerged mints. Candidate rungs: a capture-time similarity check (itd-84's validator rung), hunt briefings that read open PRs' ledgers, or a shared mint registry as a side effect of itd-114's forge-backed option