Winch Labs

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.