#3705: the "parallel + timeout" fix that could not execute

The old hook claimed parallel scans with 45s timeouts. In reality every scan ran synchronously inside the Promise executor, so they ran one after another, the timers could never fire, and with no lock every concurrent session ran its own full scan. Drag the sliders to see what each design actually does.

2 sessionsconcurrent Claude sessions
30s npm auditnpm audit duration
300s semgrepsemgrep --config auto (network fetch)
60s secret scanunbounded secret scan
before: runs to completion, blocking after: async, done under cap after: killed at 45s cap skipped (gate or lock)

Before (#905 as shipped, inert)

Sequential per session; every session scans; timers dead; semgrep fetches rules over the network every Stop.

machine-wide work:

After (#3705)

Clean tree = no scan. Machine-wide lock = one scan total. Scans genuinely parallel; child_process kills at 45s. semgrep only with a local config (skipped here: none). Secret scan capped.

machine-wide work: