Skip to content
Field notes · BlogAugust 8, 2026 · 6 min read

Our Own Gate Blocked Us Five Times in One Day. It Was Right Four Times.

On August 8, 2026, version 0.2.57 of our CLI failed its own commit gate.

The blocking finding was a HIGH severity secret at packages/analyzer-engine/src/secrets.ts:286. That line is a comment. Specifically, it is the comment that explains why assigning the literal string "password" to a variable named password stays reported as a weak credential. The comment documenting the rule tripped the rule it documents. And yes: the first draft of this very paragraph quoted the example verbatim, and the gate blocked this post for it too. We rephrased instead of suppressing, which is the correct order of preference.

That is the kind of finding that gets a security tool uninstalled, so we treated it as the day's first defect. The fix was not "skip comments." A commented-out line carrying a real key is still a leak, and a code span in prose would otherwise become a place to hide one. The fix requires the quoted value to be independently provable as not a credential, using two anchors that already existed and were already measured: the value spells out its own key, so it carries no entropy the key did not already have, or its body was typed rather than generated, a threshold twenty thousand random bodies fail to reach. We replayed the change over roughly 26,000 files across eleven outside repositories before shipping. The before and after outputs were byte identical everywhere except our own source, where three false HIGHs became four INFO disclosures. That shipped as 0.2.58.

The second block came from a test that passed everywhere except inside the gate. Our pre-commit hook runs verification in a snapshot of your tree, and that snapshot has no .git directory. A test that discovered files by shelling out to git died with "fatal: not a git repository" only when the hook ran it. The gate was the only environment honest enough to catch the assumption. The test now walks the filesystem.

The third block said "Secret scanning stopped after 50 matches" and refused the commit. That message does not exist in the current engine. The machine's globally installed CLI was thirty one versions old, and the block was the old binary's bug, fixed long ago. This was the one wrong verdict of the day, and the lesson is not "the gate cried wolf." The lesson is that a stale gate produces false verdicts a customer would blame on the product, so the hook should warn when its binary lags the repository's own published artifact. That is now on the roadmap.

The fourth was not a block but a score. The hosted audit finished on our repository and printed Security 32. Most of that deduction was our own planted test credentials, values that must look real because our tests assert the scanner still catches them, each carrying a dismissal marker with a written reason. It turned out scoring never read the dismissals, and the hosted pipeline never attached them. Two fixes, 0.2.60 and a pipeline change, and the score now prices only what nobody has dismissed with a reason. The dismissed rows stay on every receipt as evidence, because a comment in a repository must never decide what the signed evidence is allowed to say.

The fifth was fourteen findings we verified as false positives by reading every flow by hand: redirects that all pass through a sanitizer which validates its own output, and a path check flagged on the very code that implements the containment. The engine analyzes one file at a time and the sanitizer is imported, so the engine cannot see it. The honest fix is deep interprocedural work we have scoped and not yet built. Until then, each site carries a dismissal with its reason and its date, priced at zero and disclosed on every receipt, which is exactly the workflow we would tell a customer to use.

Seventeen pull requests and four releases shipped that day, every one through the same gate that did the blocking. We publish this not because the numbers are impressive but because the failure modes are the product: a gate that blocks you for real reasons, discloses what it could not see, and leaves a signed trail when a human overrules it. If your verification tool has never embarrassed you, it is probably not looking.

Related CodeTruss guides

We Scanned Ourselves and Got 14 False Positives. The Real Bug Was in the Sanitizer.

CodeTruss scored CodeTruss at 77 health and 50 security on exactly 14 HIGH findings. Adjudication threw out all 14, and then we found a live open redirect the scan never reported: a sanitizer that validated its input and returned its normalized output.

We Merged 18 Pull Requests in One Night. Our Own Gate Blocked Us First.

Eighteen merges to main in five hours, every commit pushed through the CodeTruss pre-commit gate. It blocked a credential-shaped test fixture, refused untrusted commands in every fresh worktree, surfaced two of its own bugs, and failed three production deploys out loud.

We Caught 6 of 9 Bugs. We Are Publishing the 3 We Missed.

CodeTruss built a corpus of nine bugs AI agents actually write, detected six at the exact line, and swept the new rules across eight repositories for zero false positives. Here is the whole result, including the misses and the rule we had to split before shipping.

Auditing an AI-Built SaaS: The LastSaaS Release Checklist Field Note

An independent public-source scan of jonradoff/lastsaas, a Go SaaS foundation built with Claude Code, shows how repository evidence becomes a fork release checklist — and why every automated security finding was rejected on manual review.

What the Official Next.js SaaS Starter Leaves for Your Release

An independent public-source scan of nextjs/saas-starter shows the release work a deliberately minimal template assigns to every fork: tests, CI, webhook configuration, seed hygiene, and tracking upstream security fixes.

Release Checklist for an AI-Ready SaaS Template: Open SaaS Field Note

A redacted public-source field note on wasp-lang/open-saas shows how CodeTruss turns auth, billing, jobs, email, file upload, CI, and Playwright evidence into a release checklist.

Put the same gate on your agent

The CLI is free and local-first. Every verdict in this post came from the same binary you can install right now, and nothing leaves your machine unless you sync it.