no-swallow — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited no-swallow (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
A caught error you do nothing with is a bug that hides itself.
except: pass and catch (e) {} don't make the failure go away — they make it invisible. The operation still failed; you just deleted the evidence. The next person debugging a wrong result, a missing row, a half-written file has no log line, no stack trace, no signal at all. The model reaches for the empty handler constantly to make a red squiggle or a crash disappear.
Never swallow a caught error. Everyexcept/catchdoes ONE of four real things: handle it, log it, re-raise it, or return a real fallback. An empty body is not one of them.
except: pass, except SomeError: pass, or a multi-line except whose body is only pass / ... / continue / break. Bare except: (catch-all) is worse — it swallows everything, including bugs you didn't anticipate.catch (e) {}, catch {}, catch (e) { }; promise .catch(() => {}), .catch(() => null), .catch(() => undefined), .catch(function(){}).catch (...) {}; Swift bare catch {}.if err != nil { immediately followed by } — the error is checked and then thrown away.except/catch that logs (logger.error, console.error, print), re-raises (raise, throw, rethrow), returns a value, sets a variable / error state (setError(e)), or calls a real handler (.catch(handleError), .catch(err => setError(err))).except ... : raise / catch (e) { throw e } — re-raising is handling.except ImportError: with a real fallback import in the body — that's a deliberate compatibility path doing work.try? (optional-try) — that's a language idiom for "give me nil on failure," not an empty handler. Never flagged.The gate already knows the difference — a body that logs, raises, returns, assigns, or calls anything meaningful passes untouched.
Re-read your diff for the try/except/catch/if err != nil you wrote. For each, ask: if this fires, what actually happens? If the answer is "nothing," it's a swallow.
logger.error(e), console.error(e)), so the failure is visible.raise / throw so a layer that can does.pass is none of these. A comment explaining why you're ignoring it is still not handling it.
Sometimes a best-effort cleanup should be swallowed (closing a socket that may already be closed, deleting a temp file that may already be gone). That's a decision — declare it:
NO-SWALLOW: INTENTIONAL — best-effort temp-file cleanup; failure is irrelevant here
NO-SWALLOW: INTENTIONAL — optional cache warm; a miss is fine, real path re-fetchesThe Stop hook scans code you edited this turn for swallowed handlers and blocks the turn unless each is handled or you've recorded that line.
The gate is deliberately conservative and fails open — error swallowing is harder to detect than a stray console.log, so when a body is ambiguous it passes. It only flags a handler whose body is genuinely empty (or comments only) with nothing that logs, raises, returns, or acts. try?, fallback imports, and any real statement in the body are safe.
False positive (the gate misread a handler that does real work): touch .no-swallow-off in the project root, or export NO_SWALLOW_GATE=off.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.