Documentation Index
Fetch the complete documentation index at: https://docs.automagik.dev/llms.txt
Use this file to discover all available pages before exploring further.
The one-line check
| Code | Meaning |
|---|---|
0 | All verification stages pass |
2 | Cosign signature does not match the binary |
3 | Cosign certificate identity does not match the pin (workflow path / OIDC issuer / source-uri) |
4 | SLSA provenance attestation invalid or missing |
5 | No signature material found alongside the binary |
--verbose to see the raw cosign + slsa-verifier output for ticket purposes.
What each stage actually proves
SHA256 against manifest.json
SHA256 against manifest.json
Confirms the binary on disk matches the bytes Namastex published. This protects against transit corruption and naive substitution but proves nothing about who produced the binary — any attacker who controls the CDN can rewrite both the binary and the manifest. The sha256 stage is a defense-in-depth gate, not the trust anchor.
Cosign keyless signature
Cosign keyless signature
Verifies that the binary’s bytes were signed during a GitHub Actions run. The Sigstore certificate (
genie.cert) records which workflow signed it (path + branch/tag + commit SHA + OIDC issuer). This proves a real GitHub Actions job produced the binary — a CDN attacker without GitHub Actions access cannot forge a valid signature.Fulcio certificate identity match
Fulcio certificate identity match
Compares the workflow path / OIDC issuer / source-uri inside the Fulcio cert against the pinned identity Genie embeds at compile time. This is the load-bearing check: it prevents an attacker who took over a different Namastex repo from publishing valid-looking signatures. The identity pin is documented across four independent channels; the bundled value matches the install-time channel.
SLSA Level 3 provenance
SLSA Level 3 provenance
Verifies the build occurred on a hardened isolated GitHub-hosted runner using the documented
slsa-github-generator workflow. SLSA L3 means: build script + build inputs are recorded, the build environment is non-falsifiable, the provenance attestation is generated outside the user-controlled workflow body. Confirms the binary you have was built from the source commit it claims.Source path resolution
Source path resolution
Sanity-check that
genie on $PATH actually resolves to the binary that was just verified — not a different binary earlier in $PATH that happens to also run. Catches operator misconfiguration, not adversarial behavior.Manually cross-checking the four pinning channels
Whengenie sec verify-install reports identity-mismatch (exit 3), the quickest way to triage is to look at all four pinning channels yourself and see which one disagrees:
https://github.com/automagik-dev/genie/.github/workflows/<workflow>.yml@<branch-or-tag> with the OIDC issuer set to https://token.actions.githubusercontent.com).
If any one disagrees:
- One channel different, three match the binary’s claim: the disagreeing channel is stale or compromised. File an issue with the four values + the
--verboseoutput ofgenie sec verify-install. - Three channels match each other but not the binary: the binary is suspect. Do not run mutating subcommands. Re-install from a different network/region to rule out a regional compromise.
- Two-vs-two split: stop and email
security@namastex.io. This pattern indicates a sophisticated attacker who compromised at least two distribution points.
Offline verification
genie sec verify-install runs offline by default — every check uses material already on disk (the binary, its signature, the certificate, the provenance file, and the inlined identity pin). No transparency-log call to Sigstore is required.
For an extra check, pass --online:
--online queries the Rekor transparency log to confirm the signature was logged at signing time. This catches a narrow class of attacks where the attacker has the signing keys but couldn’t write to Rekor. Useful in incident response; not required for routine operation.
When to refuse to run anything
genie sec verify-install should be run:
- ✅ Immediately after a fresh install
- ✅ Before running any
genie sec remediate --applyor other mutating subcommand (Genie does this automatically; the manual run is just to know in advance) - ✅ After every
genie self-update(also automatic post-update; manual recheck adds confidence) - ✅ Whenever you suspect a regression — fresh
which genieand verify
2, 3, or 4 and you can’t find a benign explanation in the four-channel cross-check, treat the host as compromised: stop running genie, isolate, and follow /genie/incident-response/canisterworm for the response runbook.
What --unsafe-unverified is for
In incident response, you may need to run genie sec remediate --apply before signing infrastructure is restored. The override:
INCIDENT_ID argument matches a strict regex (documented in /genie/security/key-rotation#incident-id-contract) and is recorded in the audit log. Three contexts are documented as legitimate:
BURNED_KEY_<date>— public key compromise confirmed by Namastex securityCI_PRE_SIGNING_<date>_<job>— CI pipeline before signing shipsTEST_HARNESS_<date>— integration tests