Skip to content

FAQ

Written from objections actually raised — several by hostile reviews of this work, several by us against ourselves. Where the objection landed, it says so.

"Isn't this just linting with extra steps?"

A linter answers did I find a problem. These answer was I able to look. The difference only shows up on degenerate input, which is exactly where a linter quietly returns success. Hand a linter an empty file and it is happy. Hand gridlock an empty graph and it refuses to certify it.

"Exit code 2 is non-standard. Why not just fail?"

Because they mean different things and conflating them destroys both. 1 says I checked and found a defect — actionable, fix it. 2 says I could not check — usually a configuration problem, and fixing the code will not help.

If they were the same value, every "could not check" would be triaged as a bug in the code, and after the third false alarm the check would be disabled.

"You made the CI Action default to not failing on UNVERIFIED. Isn't that fail-open — the exact thing you criticise?"

This is the best objection on the page and it is half right.

It would be fail-open if anything were reported as verified. Nothing is: the verdict is UNVERIFIED in the summary, in SARIF, in the step outputs, and in the JSON. The only question is whether it turns the tick red.

We resolved it toward not reddening because a check that goes red when an optional tool is missing is a check that gets deleted within a fortnight — and then nothing is reported at all. fail-on: unverified is one line away if you disagree, and all nine cells of that matrix are pinned by a test. The reasoning is in the module docstring, not just here.

"The empty-graph bug is trivial. Who ships that?"

We did. gridlock certified {} as SAFE and printed "rank strictly decreases on every edge: yes". There was a test asserting that behaviour was correct — test_empty_graph_is_safe. It was inverted rather than deleted, and kept as a marker.

all([]) being True is not obscure. It is trivial and it shipped, which is the point.

"Your benchmark accused a correct tool. Why should I trust it?"

You should trust it more for that being written down. On its first live run abstain-bench reported two unearned passes against a correct verifier: {"a": []} — one node waiting on nothing — genuinely cannot deadlock. Both cases moved to a sound_pass category scored in neither direction.

A benchmark that manufactures findings is exactly as untrustworthy as the unearned passes it exists to measure. If you find another false accusation, it is a bug and we will move the case.

"Is any of this novel?"

Mostly no, and the packages say so. floorgen is pigeonhole lifted pointwise — its own reports and its CLAIMS-MAP state that it makes no novelty claim. gridlock's theorem is textbook. Clopper–Pearson is from 1934.

What is contributed is the refusal discipline applied consistently, the exact mechanised counts, and the honest scope sections. If you want novelty claims, this is the wrong portfolio.

"Why is there no speedup number anywhere?"

Because we measured one and it did not survive. A live comparison came out at ≈0.997×. There is no performance claim in this portfolio, and there will not be one that is not reproducible from published code.

"Why won't you publish results against real products?"

Responsible disclosure. The checker and the methodology ship; a league table of other people's software does not. The only subjects named anywhere in this portfolio are a synthetic example written for the purpose and our own tools. Point them at whatever you like and publish under your own name.

"What's the catch? What are you selling?"

The measuring is free and Apache-2.0 forever. The enforcement side — binding a partition key at the admission decision, the compiled gate, the certificate-issuing faucet — is covered by filed patents and licensed separately. Every repository carries a CLAIMS-MAP.md naming the nearest claim family and the specific step the open tool does not take.

Reading is free. Enforcing is licensed. See Measure vs gate.

"Can I use these in a compliance audit?"

They produce technical evidence, not legal conformity. A PASSED says every applicable check ran and held — nothing about any regulation. Anyone telling you a tool proves compliance is selling something.

"One of your tools disagreed with another."

Please open an issue with both outputs. There are differential tests between implementations precisely because a reimplementation is a second chance to be wrong — the browser version of gridlock in the visualiser Space is checked against the Python one over 400 random graphs, with 0 disagreements. A disagreement is a real bug in at least one of them.

"Do you use these on yourselves?"

Yes, and it keeps finding things. While writing the tutorial for this site, running the documented commands revealed that evidence's honestbench leg had never once run — it was invoked with the wrong argument order, argparse rejected it, and the usage message was being reported as the leg's detail. It reported UNVERIFIED, so nothing was ever falsely claimed, but the check had never happened. Both that and a broken remedy string in an error message were found by using the tools rather than reading them, and both are now covered by regression tests.