This is the record of an abcd-managed repository

abcdBetav0.16.2 · 2026-11-06

Development record

The secret scanner misses a token or home path written as a JSON escape stacked on a percent encoding (or the reverse), because it never runs one decoder on the other's output, so `ScanText` reports nothing, `Redact` leaves it, and the launch gate ships it.

issueresolvedmajoriss-2610090821491948

The secret scanner misses a token or home path written as a JSON escape stacked on a percent encoding (or the reverse), because it never runs one decoder on the other's output, so ScanText reports nothing, Redact leaves it, and the launch gate ships it.

Private security advisory GHSA-74v2-f6pg-p4fq (draft, severity high). Full text, evidence and reproduction: the security-drain-2026-10-09 run directory in the main checkout's local tier. This record stays uncommitted until its fix lands; the fix commit adds it directly to resolved/.

Evidence (lines at main 7549ca2d5): lineViews builds one percent view of the raw line and then JSON layers of that same raw line (internal/adapter/scanner/percent.go:61). The comment at internal/adapter/scanner/jsonescape.go:45 claims the two do not compose, yet jsonUnescapeOnce emits % as % (internal/adapter/scanner/jsonescape.go:100). ScanBundle counts the text file as fully scanned (internal/adapter/scanner/scanner.go:1225), and scanRefusals (internal/core/launch/dryrun.go:269) refuses only an unavailable scanner, a kept hard-fail or an Unscanned path. History and memory call the same ScanText.

Reproduction: with T a ghp_ prefix followed by 40 q characters, none of these hard-fails: token=%67 followed by T without its first character (JSON-unescape then percent-decode yields T); token=%5Cu0067 with the same tail (the reverse order); see %2F<home segments joined the same way> in the log for the probed home path (no home_path_self). The plaintext token, a single %67 and a single g of the first byte still match.

Frontmatter

idiss-2610090821491948
typeissue
lifecycleresolved
severitymajor