developer tooling for coding agents

Code quality feedback that brings your coding agent to its senses.

Agents drift, CI is too late, and existing static checks are too slow to run every turn. sensez is a small suite of CLIs that return structured signals — duplication, dead code, cycles, boundary violations, and design smells — in under a millisecond, so the agent can catch itself before the slop compounds.

Install sensez
$uvx sensez init
The problem

Coding agents drift because their feedback loop is leaky.

Three things compound on every agent-authored repo. sensez exists because fixing any one of them in isolation doesn't work.

01 · context rot

Instructions fade mid-task.

You tell it to respect boundaries, follow SOLID, and think like a staff engineer. A few turns and two context summaries later, it confidently rewrites the same CSV parser a colleague shipped two weeks ago.

follow the architectural boundary between modules…
follow the architectural boundary between modules…
follow the architectural boundary between modules…
follow the architectural boundary between modules…
follow the architectural boundary between modules…
turn n →
02 · CI is too late

Soft signals arrive where nobody acts.

CI is excellent at saying “absolutely not.” It is much worse at saying “this duplication is small, but suspicious.” You cannot block every PR over a few repeated lines, and non-blocking warnings have a natural habitat: ignored forever.

duplicate block ×3ignored
similar parser foundignored
nested branch smellignored
03 · too slow to be in-loop

Existing checks can't run every turn.

pylint's symilar took nearly four minutes on its own repository, and that's just duplicate detection. Nothing that takes minutes belongs inside an agent's edit loop.

symilar · pylint234.12s
repowise · pylint17.26s
sensez · pylint0.27s
what sensez does

A small suite of CLIs fast enough to run on every agent turn. Each one returns a short, structured signal — duplication, dead code, cycles, boundary violations, design smells — so the agent can react before the slop compounds, and before CI ever sees it.

actsenseadaptactsenseadaptµs loop · always on
Toolchain

Static analysis CLIs built for the agent loop.

Each tool is a single binary you can call from an agent loop, a git hook, or your terminal. The "senses" naming is just a mental model for what each one looks at.

noze
Code smells

Sniffs out duplication, dead code, import cycles, and design smells your linter and type checker don't own — in a compact format an agent can parse.

$ sensez noze . → 3 smells · 412µs
brainz
Local memory

Local-only metrics: scans, gate blocks, triage decisions, resolved findings. No telemetry, no source upload — everything stays under .sensez/local-metrics/.

$ sensez brainz report → 7 resolved · 2 accepted
eyez · optional

Semantic search for docs, comments, and code — catches duplicates by meaning, not just text. Downloads an embedding model on first use, then stays local.

soon
Performance snapshot

Cleaner output, less maintenance, and faster scans.

sensez helps the same agent ship tighter code with less duplication and fewer quality issues.

Impact
Broad task set comparison
New quality issues
86% fewer
Dropped from 14 to 2.
Clone tokens
90% fewer
Dropped from 1,251 to 126.
New clones
100% fewer
Went from 129 to 0.
Lines written
67% fewer
Dropped from 2,080 to 682.
Token usage
+8.7% overhead
A small cost for much cleaner output.
Speed profile
Lower is faster
Python

pylint repository

0–20s · capped
sensez0.27s
vulture1.29s
repowise17.26s
symilar234.12s
JavaScript / TypeScript

zod repository

0–5.75s
sensez0.16s
fallow0.48s
repowise5.75s

Python › sensez covers all structural pillars in 0.27s. Vulture focuses on dead code; repowise applies custom ranking that includes dead code.

Scale note › symilar checks line-based duplication and took 234.12s. Its bar is capped at 20s so the faster results remain readable.

Inside noze

Code-smell detection for Python and TypeScript.

A small, opinionated set of code smells — the ones agents trip on most often. Each one is tuned to be cheap enough to run on every turn.

tuple_packing

Tuple Packing

Agents love returning tuple[int, str, int]. To a human reader, positional tuples hide what each slot means — noze flags them so you can swap in a NamedTuple or dataclass.

loose_typing

Loose Typing

An agent will slap dict[str, Any] on a return type and call it a day. The contract becomes invisible to callers and type checkers. noze nudges you toward a tighter signature.

duplication

Duplication

Agents rarely check whether a helper already exists, and confidently re-implement it. noze cross-checks structural duplicates so you don't pay maintenance twice.

Why waste time write many code, when few code do trick?
Full smell catalogexpand
  • Boolean BlindnessBare booleans at the call site — use an enum or keyword args.
  • Data ClumpThe same group of values passed together everywhere — bundle them.
  • Deep NestingMany levels deep — flatten with early returns.
  • Divergent ChangeOne module edited for many reasons — split responsibilities.
  • Feature EnvyA method that uses another object's data more than its own.
  • God ModuleToo much of the codebase depends on it — a coupling hotspot.
  • Heavy Nested FunctionA nested function that grew large — promote it.
  • High Cognitive ComplexityHard to follow — branches and loops weighted by depth.
  • High Cyclomatic ComplexityMany independent paths — hard to test fully.
  • Implicit SchemaA dict accessed by many string keys — an unwritten schema.
  • Inappropriate IntimacyTwo classes reach into each other's internals.
  • Large ClassToo many methods and responsibilities — split it.
  • Literal MembershipBranching on `x in ['a','b']` — use an Enum.
  • Long FunctionToo many lines to grasp at once — extract pieces.
  • Long Parameter ListToo many parameters — group related ones.
  • Loose TypingPublic signature leans on `Any` or untyped — tighten it.
  • Magic NumbersUnexplained numeric literals — name them as constants.
  • Message ChainLong `a.b.c.d` chains — Law of Demeter.
  • Mutated ParameterFunction mutates a caller's argument in place.
  • Reassigned ParameterA parameter rebound mid-body — use a local.
  • Refused BequestSubclass inherits methods it doesn't use.
  • Shotgun Surgery HazardOne change ripples across many modules.
  • Split VariableOne local reassigned to mean different things.
  • Too Many ReturnsMany exit points — consolidate, or split the function.
  • Tuple PackingPositional tuples whose fields aren't named.
Install

Install sensez for Python, JavaScript, or TypeScript.

sensez ships as two language-native distributions: the Python package analyzes Python projects, and the JS/TS package analyzes JS/TS projects. Pick the one that matches your codebase.

Add sensez to your project or run via uvx, then run init to set up agent integration.

$uvx sensez init
# set up sensez for coding agents (no install needed)
$uv tool install sensez
# install globally to use sensez as a binary
$sensez init
# then run init to set up for agents
One-off scan
$uvx sensez noze .
# run a one-off scan without installing
Frequently asked questions

Code analysis for agent workflows.

The practical details about using sensez as a local static-analysis and architecture feedback layer for AI-generated code.