Hostile by default
Every scanner — including our own native engine — runs as an ephemeral Job with credentials for the target only. Results enter through one signed callback. We built the trust boundary first and the features on top of it.
We build the platform we wanted to run: scanners that cannot hurt you, one graph that connects code to runtime, and decisions that fail closed and sign themselves.
It becomes one when you know which commit introduced it, which image carries it and which workload exposes it. Security teams have never lacked results. They lack that chain.
Every scanner — including our own native engine — runs as an ephemeral Job with credentials for the target only. Results enter through one signed callback. We built the trust boundary first and the features on top of it.
52 entity types and 32 relationship verbs, frozen and versioned. When we add a type we add a version; we never change what a stored edge means.
A lineage view says source_gap when it does not know. It never draws an edge to make the picture look complete, and inferred edges never complete a strict path.
A policy error is a deny. A callback without a valid token and signature is rejected. Uncertainty is an explicit failure, never a silent pass.
Disposition is a human write with a reason code, enforced at the ORM layer and by a database trigger. AI triage is advisory and audited.
The platform's own repository and images are scanned on the same pipeline; the merge gates that block our releases are the ones we describe on this site.
Conversations start with the people who built the platform, not with a sales deck.