Sensez
Structural maintainability checks for coding agents and teams.
Sensez is a suite of Rust CLIs and an MCP server that runs alongside your linter and type-checker. It finds cross-file problems that those tools do not usually own: duplication, dead code, import cycles, architecture-boundary violations, and design smells.
It gives coding agents the noze to detect code smells, the bonez to respect
architectural boundaries, and the spine to do it fast. Python, JavaScript,
TypeScript/TSX, and Rust profiles are supported (Rust primarily for dogfooding).
Website · Documentation · MCP and agent guide · Configuration reference ·
Why Sensez?
Coding agents are excellent at producing code—and, occasionally, at producing
the same helper three times, gently ignoring architecture notes, and replacing
type-safe models with dict[str, Any]. The vibes are immaculate; the result
can still be a slopocalypse that takes hours to untangle.
Sensez closes that feedback loop while an edit is still fresh. It gives agents short, structured feedback on the repository's shape, so problems can be fixed before they become load-bearing.
The gap is especially visible in agent-driven work:
- Context rots. Architecture guidance fades across long, summarized turns.
- CI is too late. Small, non-blocking structural warnings are easy to defer.
- Slow checks do not fit the turn. If a check takes minutes, it cannot run in every feedback loop—and debt has time to accumulate.
[Agent proposes turn finish] ──> [Sensez MCP sniff] ──> [Finds cycle / clone / smell]
│
└──> Immediate, actionable feedback
Sensez complements—not replaces—Ruff, ty, mypy, ESLint, TypeScript, rustc,
and Clippy. Use those tools for local correctness; use Sensez for the structural
relationships across the codebase.
Quick start
Python
# Add to a project; run it with `uv run sensez ...`
uv add --dev sensez
uv run sensez init
# Or install a global CLI
uv tool install sensez
sensez init
# Or run a one-off scan
uvx sensez noze .
JavaScript and TypeScript
# Add as a development dependency
npm install --save-dev sensez
# Generate a starter config and scan
npx sensez init .
npx sensez noze .
sensez . and sensez noze . both run the default scan. The explicit form
sensez noze sniff . remains available for agent-oriented workflows.
What it finds
| Area | Output key | What it catches |
|---|---|---|
| Duplication | duplication |
Structural clones, including local-rename copies. |
| Dead code | dead_code |
Unreferenced symbols with confidence tiers. |
| Cycles | cycles |
Import loops and load-order tangles. |
| Boundaries | boundaries |
Imports that cross configured architecture rules. |
| Smells | smells |
Design pressure inside functions, classes, modules, and the graph. |
Some examples of the included smells:
| Smell | Why Sensez flags it |
|---|---|
tuple_packing |
Positional tuples hide meaning; tuple[int, str, int] is not a data model. |
loose_typing |
Any, schema-erasing maps, and primitive containers erase caller contracts. |
boolean_blindness |
do_thing(True, False) makes argument meaning a guessing game. |
implicit_schema |
Repeated string-key access often means a real shape is hiding in a dict. |
mutated_parameter |
A function returns a parameter after chewing it up. |
feature_envy |
A method that mostly uses another object's data may belong elsewhere. |
message_chain |
Long a.b.c.d chains couple callers to deep object plumbing. |
god_module |
One module has become the place everything depends on. |
magic_string_default |
|| "" or or "" hides a string that should be required. |
split_variable |
Multiple reassignments of a variable in one scope add hidden state. |
nested_loop |
Beta, opt-in: nested iteration may have unintended complexity. |
n_plus_one_call |
Beta, opt-in: one-by-one external calls may need batching. |
The default report is intentionally fixable in one screen: each pillar shows its
top five offenders, each smell kind shows its total plus its top three examples,
and dead-code output includes high-confidence findings only. Use --all for
every finding, or --max N to set another cap.
# Focus a CI check on the pillars you care about
sensez noze . --duplicates
sensez noze . --duplicates --dead-code --json
Performance
Sensez evaluates all structural pillars in one pass.
Python: pylint benchmark
| Tool | Time | Scope |
|---|---|---|
| sensez | 0.27 s | All structural pillars in one pass |
| vulture | 1.29 s | Python dead code |
| repowise | 17.26 s | Repository intelligence, including dead code |
| symilar | 234.12 s | Line-based duplication |
JavaScript / TypeScript: zod benchmark
| Tool | Time | Scope |
|---|---|---|
| sensez | 0.16 s | All structural pillars in one pass |
| fallow | 0.48 s | JS/TS structural dead-code and dependency findings |
| repowise | 5.75 s | Repository intelligence, including dead code |
Agent impact
The same coding agent completed 70 real-world Python tasks from SWE-PolyBench
and SWE-bench Verified, plus 21 synthetic tasks designed to trigger specific
maintainability traps. Both variants received SOLID/DRY principles. The Sensez
variant additionally had to call noze_sniff in a feedback loop before it could
declare a task complete.
| New quality issues | Clone tokens | New clones | Lines written | Tokens used | |
|---|---|---|---|---|---|
| Without Sensez | 14 | 1,251 | 129 | 2,080 | 1.23M |
| With Sensez | 2 | 126 | 0 | 682 | 1.34M |
| Reduction | 86% | 90% | 100% | 67% | +8.7% overhead |
Sensez agents produced structurally cleaner code with 67% fewer lines. Benchmarks used SWE-PolyBench_500, SWE-bench Verified, and synthetic pillar tests. See the evaluation suite for the methodology and per-benchmark results.
MCP for agents
MCP is the recommended integration when Sensez should run repeatedly during a
coding session rather than as a one-off shell command. The init command would set this up automatically on agent start.
| Tool | Use |
|---|---|
noze_sniff |
Scan the repository for smells and structural issues. |
noze_gate |
Experimental end-of-turn diff gate; may be noisy for short or Q&A turns. |
noze_explain |
Explain a finding category. |
brainz_report |
Summarize local usage and resolution metrics. |
brainz_triage |
Record user-approved debt or false-positive verdicts. |
eyez_search_docs |
Disabled unless eyez is enabled; searches docstrings and comments. |
Sensez can also run standalone in GitHub Actions. See the GitHub Action guide.
Configuration
Sensez reads sensez.toml from the project root, or [tool.sensez] from
pyproject.toml when sensez.toml is absent.
sensez init
The main configuration areas are:
[duplication]for clone thresholds[dead_code]for dynamic entry points[smells]for smell toggles and thresholds[[boundaries.forbidden]]for architecture contracts[action]for how strongly agents and gates treat each pillar[accept]for shared accepted findings[self_improvement]for local metrics
[duplication]
threshold = 50
[dead_code]
entrypoint_names = ["register", "main", "setup"]
[smells.rules.long_function]
max_lines = 80
action = "warning"
# The beta performance heuristics are disabled by default.
[smells.rules.nested_loop]
enabled = true
[smells.rules.n_plus_one_call]
enabled = true
Local-only metrics and privacy
brainz records scans, gate blocks, triage decisions, resolved findings,
regressions, detector precision, and usage reports locally.
sensez brainz report .
sensez brainz report . --json
Everything remains under .sensez/local-metrics/. Sensez sends no telemetry
and uploads no source code. Disable local metrics for a repository with:
[self_improvement]
enabled = false
Project anatomy
spine: file discovery, parsing, shared IR, and dependency graph.profiles: language adapters for Python, JS/TS, TSX, and Rust.noze: duplication, dead code, cycles, and design smells.bonez: architecture-boundary auditing; not yet enabled.brainz: local-only metrics and feedback memory.eyez: optional doc/comment search; not yet enabled.mcp: JSON-RPC/MCP surface for agent integration.reporter: terminal and JSON output.setup: starter configuration, MCP registration, and hook setup.
Disclaimer
Please review DISCLAIMER.md for the project disclaimer.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file sensez-0.2.3-py3-none-win_amd64.whl.
File metadata
- Download URL: sensez-0.2.3-py3-none-win_amd64.whl
- Upload date:
- Size: 2.8 MB
- Tags: Python 3, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
13e7eb1b4090db764240c03b8373b4975fbbb4273409105b4d6c776b7da116b6
|
|
| MD5 |
8f66bace8b1c5da4e23d328a3ab01da6
|
|
| BLAKE2b-256 |
49e04140a3c6c2d5da4e99dfce366db77face14ffd36d99731cbf131bb15327e
|
Provenance
The following attestation bundles were made for sensez-0.2.3-py3-none-win_amd64.whl:
Publisher:
release.yml on popov95s/sensez
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
sensez-0.2.3-py3-none-win_amd64.whl -
Subject digest:
13e7eb1b4090db764240c03b8373b4975fbbb4273409105b4d6c776b7da116b6 - Sigstore transparency entry: 2253722064
- Sigstore integration time:
-
Permalink:
popov95s/sensez@ea31b190c56d38991398320df1e141231be10a81 -
Branch / Tag:
refs/tags/v0.2.3 - Owner: https://github.com/popov95s
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@ea31b190c56d38991398320df1e141231be10a81 -
Trigger Event:
push
-
Statement type:
File details
Details for the file sensez-0.2.3-py3-none-manylinux_2_39_x86_64.whl.
File metadata
- Download URL: sensez-0.2.3-py3-none-manylinux_2_39_x86_64.whl
- Upload date:
- Size: 3.2 MB
- Tags: Python 3, manylinux: glibc 2.39+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
56f0c9b583d72854723b4760b2f77dc4020995b0452df76f49857863dfddccd7
|
|
| MD5 |
cc108b21d1dd5c4fc3550af58ae1470c
|
|
| BLAKE2b-256 |
cca842feb6dfa87e7852daa6e1c9a9bc2076b2ced4069a506835c6b1373a500d
|
Provenance
The following attestation bundles were made for sensez-0.2.3-py3-none-manylinux_2_39_x86_64.whl:
Publisher:
release.yml on popov95s/sensez
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
sensez-0.2.3-py3-none-manylinux_2_39_x86_64.whl -
Subject digest:
56f0c9b583d72854723b4760b2f77dc4020995b0452df76f49857863dfddccd7 - Sigstore transparency entry: 2253721619
- Sigstore integration time:
-
Permalink:
popov95s/sensez@ea31b190c56d38991398320df1e141231be10a81 -
Branch / Tag:
refs/tags/v0.2.3 - Owner: https://github.com/popov95s
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@ea31b190c56d38991398320df1e141231be10a81 -
Trigger Event:
push
-
Statement type:
File details
Details for the file sensez-0.2.3-py3-none-manylinux_2_39_aarch64.whl.
File metadata
- Download URL: sensez-0.2.3-py3-none-manylinux_2_39_aarch64.whl
- Upload date:
- Size: 3.2 MB
- Tags: Python 3, manylinux: glibc 2.39+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ffbae4739c58eecd8b2345c02d53ed146db638a851fd227cfe964b1a94c74faa
|
|
| MD5 |
bf2127a3dc653c6fbc674f35a96325fa
|
|
| BLAKE2b-256 |
3693cf95c5946c05b26ea31bc6aefefc73211e525dcdc8177d8e2481d5d011a0
|
Provenance
The following attestation bundles were made for sensez-0.2.3-py3-none-manylinux_2_39_aarch64.whl:
Publisher:
release.yml on popov95s/sensez
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
sensez-0.2.3-py3-none-manylinux_2_39_aarch64.whl -
Subject digest:
ffbae4739c58eecd8b2345c02d53ed146db638a851fd227cfe964b1a94c74faa - Sigstore transparency entry: 2253721357
- Sigstore integration time:
-
Permalink:
popov95s/sensez@ea31b190c56d38991398320df1e141231be10a81 -
Branch / Tag:
refs/tags/v0.2.3 - Owner: https://github.com/popov95s
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@ea31b190c56d38991398320df1e141231be10a81 -
Trigger Event:
push
-
Statement type:
File details
Details for the file sensez-0.2.3-py3-none-macosx_11_0_arm64.whl.
File metadata
- Download URL: sensez-0.2.3-py3-none-macosx_11_0_arm64.whl
- Upload date:
- Size: 2.9 MB
- Tags: Python 3, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
123c46cf88ac0dd09fe07f1df19c04783cb9b46467e5ca844d8a9a40f77a30c0
|
|
| MD5 |
958ae45b74981e0aedf9dd4111094fd9
|
|
| BLAKE2b-256 |
de61e841398d2027659d4a0758ea07ade2528c9102c289605607d902ed7c7ea2
|
Provenance
The following attestation bundles were made for sensez-0.2.3-py3-none-macosx_11_0_arm64.whl:
Publisher:
release.yml on popov95s/sensez
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
sensez-0.2.3-py3-none-macosx_11_0_arm64.whl -
Subject digest:
123c46cf88ac0dd09fe07f1df19c04783cb9b46467e5ca844d8a9a40f77a30c0 - Sigstore transparency entry: 2253722276
- Sigstore integration time:
-
Permalink:
popov95s/sensez@ea31b190c56d38991398320df1e141231be10a81 -
Branch / Tag:
refs/tags/v0.2.3 - Owner: https://github.com/popov95s
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@ea31b190c56d38991398320df1e141231be10a81 -
Trigger Event:
push
-
Statement type:
File details
Details for the file sensez-0.2.3-py3-none-macosx_10_12_x86_64.whl.
File metadata
- Download URL: sensez-0.2.3-py3-none-macosx_10_12_x86_64.whl
- Upload date:
- Size: 3.1 MB
- Tags: Python 3, macOS 10.12+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5568fdab175a446a356c2687e5b53de0e4872360ff7dc109db16a2ecd051744e
|
|
| MD5 |
c9a32c704c8928637ecbc247051bc03a
|
|
| BLAKE2b-256 |
f27423f2c18a7adc2187233e878edca5e0ccceaa5c70102d7cdb5990cc314067
|
Provenance
The following attestation bundles were made for sensez-0.2.3-py3-none-macosx_10_12_x86_64.whl:
Publisher:
release.yml on popov95s/sensez
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
sensez-0.2.3-py3-none-macosx_10_12_x86_64.whl -
Subject digest:
5568fdab175a446a356c2687e5b53de0e4872360ff7dc109db16a2ecd051744e - Sigstore transparency entry: 2253721861
- Sigstore integration time:
-
Permalink:
popov95s/sensez@ea31b190c56d38991398320df1e141231be10a81 -
Branch / Tag:
refs/tags/v0.2.3 - Owner: https://github.com/popov95s
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@ea31b190c56d38991398320df1e141231be10a81 -
Trigger Event:
push
-
Statement type: