Trust Policies
ProGit supports multiple trust policies for different security postures:
Strict
Requires one valid signature from a trusted key.
hinge verify pkg.jpk --mode strict
Best for: Individual developers
Consensus
Requires N of M valid signatures from trusted keys.
hinge verify pkg.jpk --mode consensus --threshold 2/3
Best for: Organizations, high-security environments
Deeplinks: UX, Not Security
Important: Deeplinks like progit://install/plugin are
user experience shortcuts, not security mechanisms.
⚠️ What deeplinks are NOT:
- Not cryptographic proofs
- Not integrity guarantees
- Not tamper-evident
- Not revocation channels
✓ What deeplinks ARE:
- Convenient install triggers
- Pointers to manifests
- URL-encoded plugin names
- The same as typing
prog plugin install X
The security happens after the deeplink triggers the install:
when ProGit fetches the manifest and runs Hinge verification.
Key Rotation (July 2026)
The original "ProGit Core Team" plugin-signing key
(18a10eb52cf3c001) was a test artifact: it
signed with a BLAKE3-based MAC mislabeled as dilithium3-test,
with the shared secret hardcoded in public source. It has been replaced
with a genuine ML-DSA-44 / Dilithiumium3 keypair:
- New KeyID:
f04a5dcf0f9ffd2c - Algorithm:
dilithium3 (real FIPS 204, ~3.3KB signatures)
If you trusted the old key: on your next
prog plugin index update, ProGit verifies the rotated registry
index and recognizes the rotatedFrom claim — the index is
accepted (one-step bounded, signature-gated, stateless per-document trust).
To then verify or install plugins signed by the new key, run:
prog trust add f04a5dcf0f9ffd2c
You'll see the hint after index update:
🔄 Registry index verified via key rotation from 18a10eb52cf3c001
To trust plugins signed by the new key f04a5dcf0f9ffd2c, run:
prog trust add f04a5dcf0f9ffd2c
Auto-promotion to direct trust was considered and rejected: the registry is
a plain git repo over HTTPS, so a self-asserted rotatedFrom is
not strong enough to permanently trust a key for all plugins. The index
migration is stateless (per-document); trusting the new key for plugins is a
deliberate one-command user action.