Jason Fricano
A closer look / Garnet Guard

What changed
since you trusted it?

A dependency update asks for a small act of trust. I’m building Garnet Guard to make the changes behind that decision easier to inspect.

My role
Product direction & development
What I’m making
Python-first release comparison tool
Current state
Pre-alpha command-line preview from source
Garnet GuardOne package / two releases
demo 1.0 → 1.1: WARN
  WARN  GRN-C003 new-import-time-exec: 1.1 adds import-time calls to sensitive APIs in 1 module(s)
           - demo/__init__.py:2 calls subprocess.run
  WARN  GRN-T001 lost-provenance: 1 file(s) in 1.1 have no attestation; every file of 1.0 had one
           - demo-1.1-py3-none-any.whl: no attestation
           - 1.0 was attested by github.com/o/r .github/workflows/release.yml

verdict: warn
Actual comparison-engine output, generated October 17, 2026 from synthetic in-memory releases. This is a controlled walkthrough, not a scan of a published package or a running browser tool. Package contents were inspected statically; the subprocess call shown here was never executed.
01 / The problem

A version number
isn’t much evidence.

A familiar package name can make an update feel routine. But the release may come from a different build process, lose its provenance, or introduce code that runs as soon as another program imports it.

I wanted the comparison itself to be useful: what changed from the version someone already trusted, where that change appears, and why it deserves attention. The tool reads package artifacts rather than running their code.

02 / The walkthrough

Two changes.
A reason to look closer.

The synthetic package above starts at version 1.0 with a simple value and verified-provenance facts. Version 1.1 adds a module-level subprocess.run call and has no attestation. The fixture supplies the provenance facts; this walkthrough does not verify a real publisher’s signature.

The working engine flags both differences. GRN-C003 identifies the new import-time call and its location, demo/__init__.py:2. GRN-T001 identifies the lost attestation and records the earlier publisher and workflow. Both findings carry a warning.

A subprocess call can have an ordinary explanation. A missing attestation can be a release-process mistake. Those are reasons to inspect the change, not enough evidence to call a package malicious.

03 / The decisions

Keep the uncertainty
beside the finding.

The report pairs a rule with concrete evidence. It distinguishes a warning from a block, and an inspection failure from a completed check. A reader needs to know when the tool could not collect enough evidence.

Comparing releases also keeps the question specific. The useful signal is a trust property that disappeared or a sensitive behavior that appeared. A report with no findings still cannot certify that a package is safe.

The same comparison can produce readable text for a person or structured JSON for another tool. The presentation changes; the underlying evidence stays available.

04 / Available today

A working comparison.
A larger tool in progress.

The public source checkout includes the pre-alpha garnet diff command for comparing two PyPI releases, plus rule explanations and text or JSON output. The project README contains setup instructions and the current limits.

Broader integrations, including dependency-update pull requests and agent hooks, remain in development. This case study demonstrates the comparison engine on controlled fixtures; it does not establish production readiness or measure how reliably the tool catches attacks.

Try the command-line preview from source

Core technologies

Follow the evidence.