Start here
The six invariants
Six things that are true of every build, enforced by tests rather than by intention. They are listed here with the mechanism, because a promise you cannot check is a marketing claim.
1. No apply, and no cloud write
No code path executes terraform apply, tofu apply, or performs any write against a cloud provider. Garboard holds no cloud credentials, so there is nothing to misuse — this is a property of what the binary contains, not a permission we decline to exercise.
2. Every table is organisation-scoped
Every table carries an org_id, and every query filters on it. Multi-tenancy is not a feature layered on top; it is the shape of the schema. Tests such as TestServerGateBudgetIsOrgScoped, TestFixLinkIsOrgScoped and TestRCDHistory_OrgScoped assert it per subsystem rather than once globally, because a single global assertion is exactly the kind that stops being true for one new table.
3. Model output never enters the facts layer
Parser facts are truth. A language model’s output is never written into them. This is what makes the conventions trustworthy: they are derived from what your code says, and there is no path by which a model’s guess can become a stored fact that later reviews cite as evidence.
4. Generated fixes go through the same gate as your pull requests
Fixes and Forge drafts pass through review.RunChecks — literally the same function an external pull request uses, not a parallel implementation that is supposed to match. Tests including TestForgeDraftIsGatedByAdoptedRules, TestAdoptedRuleReachesTheFixRegate and TestRun_GateBlocksPR fail if generated output can bypass it.
The point is narrow and important: Garboard cannot approve its own homework.
5. scan works completely offline
garboard scan with no API key and no network fully succeeds, in facts-only mode. Conventions, evidence, the RCD — all of it is a parse. The API key buys prose and fixes; it buys nothing about the verdict.
You can verify this one in about a minute on a laptop with the network off.
6. A pull request with nothing to say gets no comment
At most three findings per comment. Findings without file-and-line evidence are dropped as bugs. And a clean pull request receives nothing at all — no “looks good”, no green tick comment, no noise.
There are exactly two narrowings, both context rather than findings: a priced monthly cost increase at or above your configured threshold, and a blast radius at or above yours. Neither carries a severity, neither takes one of the three slots, and both render as a blockquote. TestNoChangeIsSilent asserts the base case.
This invariant has its own page, because it has a consequence people do not expect: a correct install and a broken one look identical on a clean pull request.
Why publish these
Every one of them is falsifiable. Invariant 1 is checkable from the App’s permission grant in five minutes. Invariant 5 is checkable by pulling the network cable. That is the point — the argument for this product is not that we are careful, it is that the careful bits are structural and you can go and look.
