Oneport Impact
"What breaks if I touch this?" — the blast-radius engine that reads your repo's own structure and history, on your machine.
Before you change a function, one command tells you who calls it, which tests
cover it, which files historically change with it, and who to ask — then an LLM
judges how load-bearing it is. grep finds text; Sourcegraph finds references.
Neither tells you that models.py and serializers.py change together 83% of
the time even though there's no import between them. That temporal coupling
lives only in git history — and Impact mines it locally, so nothing is uploaded
to learn it.
$ oneport-impact analyze billing/stripe.py
Blast radius: billing/stripe.py (file)
LOAD-BEARING · 128 call site(s) across 34 file(s) · 61 commits in history
This is core payment code exercised across the app; a signature change here
ripples into checkout, webhooks, and the admin refund flow.
Check first: billing/webhooks.py — changes with this file 83% of the time
Changes together with (temporal coupling)
83% billing/webhooks.py (51/61 commits)
44% tests/test_payments.py (27/61 commits)
Ask
@payments-team [CODEOWNER]
Priya Nair (22 commits, last 2026-05-30)
Why it's different
| Tool | What it gives you | The gap |
|---|---|---|
grep / IDE "find usages" |
text matches | no ranking, no history, no judgment |
| Sourcegraph | cross-repo references | search, not risk; needs your code on their servers |
| oneport-impact | callers + temporal coupling + ownership + risk verdict | local-first — your code never leaves the machine |
Every fact is deterministic (Python ast + git log); the model only judges
the facts. When a symbol's name is too common to attribute reliably (__init__,
get), Impact refuses to guess rather than report an inflated number — the
line between "structured, better than grep" and "confidently wrong."
Install
pip install oneport-impact
# optional, for the risk verdict — detection (call graph + co-change) works without it.
# 0-BYOK: no model API key. The verdict runs on OnePort's managed models, metered
# to your account. Get a token at https://www.oneport.co.in/console, then:
onp account login <op_live_...>
Use
# Query the blast radius of a symbol or file
oneport-impact analyze charge # by name
oneport-impact analyze billing.stripe.Client.charge # by qualname
oneport-impact analyze billing/stripe.py # by file
# Gate a change set (for pre-commit / CI)
oneport-impact check --staged # what you're about to commit
oneport-impact check --head # the last commit
oneport-impact check --staged --format json # machine-readable
oneport-impact check --staged --format sarif # SARIF 2.1.0 for code scanning
oneport-impact analyze charge --no-llm # facts only, no API key
Exit code is 1 when a change trips a blocking finding (per --fail-on),
0 otherwise — drop check straight into CI.
Polyglot
Call-graph fan-in is Python-only, but co-change and ownership come from git and
work for any file. A change to service.go still gets a real blast radius —
the files it usually moves with, and who owns it — with fan-in honestly marked
unavailable rather than reported as a misleading "0 callers".
What the gate flags
- IMP001 — wide blast radius: you're changing a symbol many places call.
- IMP010 — missing co-change companion: you changed a file but not the file
it historically changes with, e.g. "you changed
model.pybut notserializer.py, which changes with it 80% of the time."
Waivers
Some files are legitimately load-bearing. Approve one without opening the gate
for everything — drop a .oneport/impact-waivers.yml:
waivers:
- path: "billing/stripe.py" # glob, matched against the finding's file
rule_id: "IMP001" # optional — narrow to one rule
reason: "core client, reviewed every change in #eng-payments"
expires: "2026-12-31" # optional; the gate closes again after it
A waived finding still appears (marked [WAIVED], suppressed in SARIF) but no
longer fails CI; an expired waiver starts failing again automatically.
Configure — .oneportrc
thresholds:
fan_in_warn: 8 # callers before a change is "wide"
fan_in_error: 25 # …before it's "very wide"
cochange_confidence: 0.5 # a companion must co-change this often to be flagged
cochange_min_together: 3 # …and at least this many times
max_commits: 1500 # history depth mined for co-change
The same .oneport/guidelines.md the rest of the suite reads is fed to the risk
verdict as context ("our payments module is business-critical").
In the Oneport gate
oneport-impact is an opt-in gate in op ship.
Enable it in .oneport/oneport.yaml:
enable:
- impact
It's advisory by default (warns, blocks only on critical) — it informs the ship decision without nagging.
Privacy
Serverless by design. The call graph, co-change mining, and ownership all run on
your machine from your repo's own .git. Only the optional one-paragraph risk
verdict calls a model, on your key. There is no Oneport server; your code never
leaves the building.
How it works
callgraph.py— reverse call graph via theastmodule, with an ambiguity guard so common names don't inflate fan-in.cochange.py— temporal-coupling miner overgit log, skipping mass-change commits that would couple everything.ownership.py— git authors + CODEOWNERS.advisor.py— the LLM risk verdict; judgment only, never invents facts.
MIT licensed.
Metadata
Release files for oneport-impact 0.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| oneport_impact-0.3.0.tar.gz | 32.3 kB | Without provenance | Details for oneport_impact-0.3.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| oneport_impact-0.3.0-py3-none-any.whl | Python 3 | none | any | Details for oneport_impact-0.3.0-py3-none-any.whl |
Total release size: 68.7 kB
Release files / oneport_impact-0.3.0.tar.gz
| Download URL | oneport_impact-0.3.0.tar.gz |
|---|---|
| Size | 32.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ec7a98ef391ed5d1a45c9d200f7742470eb8dbc52063adf6645433ea02b90ecc
|
|
BLAKE2b-256 checksum How to use checksums |
90c13a1f132d85ed90cf63bf6d9a5906922ee4eb600665909a0bb7c82f2a935d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.0
|
Release files / oneport_impact-0.3.0-py3-none-any.whl
| Download URL | oneport_impact-0.3.0-py3-none-any.whl |
|---|---|
| Size | 36.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
305345f685bf60efb1be1213ae9364945b9f3c0fcc248da9f344c7103666cf66
|
|
BLAKE2b-256 checksum How to use checksums |
fba65a3aecb0284fd5247ac106e043360fe88df7024e479f3085f330b68250ba
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.0
|
Security for oneport-impact 0.3.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.