Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions sensor/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
[workspace]

[package]
name = "iii-sensor"
version = "0.1.0"
edition = "2021"
publish = false

[[bin]]
name = "iii-sensor"
path = "src/main.rs"

[dependencies]
iii-sdk = "0.11.0"
tokio = { version = "1", features = ["rt-multi-thread", "macros", "sync", "signal", "process"] }
serde = { version = "1", features = ["derive"] }
serde_json = "1"
serde_yaml = "0.9"
anyhow = "1"
tracing = "0.1"
tracing-subscriber = { version = "0.3", features = ["fmt", "env-filter"] }
clap = { version = "4", features = ["derive"] }
chrono = { version = "0.4", features = ["serde"] }
walkdir = "2"
68 changes: 68 additions & 0 deletions sensor/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
# iii-sensor

The code your AI writes today is the context it reads tomorrow. Every session silently degrades your architecture unless you measure it. iii-sensor scans your codebase, computes a quality score across 5 dimensions (complexity, coupling, cohesion, size, duplication), saves baselines before agent sessions, and flags when quality drops. It's the feedback sensor in the harness engineering loop.

**Plug and play:** Build with `cargo build --release`, then run `./target/release/iii-sensor --url ws://your-engine:49134`. It registers 6 functions. Call `sensor::baseline` before a coding session, then `sensor::compare` after to see what changed. Wire `sensor::gate` into your CI to reject PRs that degrade quality below your threshold.

## Functions

| Function ID | Description |
|---|---|
| `sensor::scan` | Walk a directory and compute per-file code quality metrics |
| `sensor::score` | Aggregate quality score (0-100) from scan results using weighted power mean |
| `sensor::baseline` | Save a named baseline snapshot for later comparison |
| `sensor::compare` | Compare a fresh scan against a saved baseline to detect degradation |
| `sensor::gate` | CI quality gate returning pass/fail on score thresholds |
| `sensor::history` | Retrieve historical scores and compute trend direction |

## iii Primitives Used

- **State** -- baselines, score history, latest scan results (keyed by path hash)
- **HTTP** -- all functions exposed as REST endpoints

## Prerequisites

- Rust 1.75+
- Running iii engine on `ws://127.0.0.1:49134`

## Build

```bash
cargo build --release
```

## Usage

```bash
./target/release/iii-sensor --url ws://127.0.0.1:49134 --config ./config.yaml
```

```
Options:
--config <PATH> Path to config.yaml [default: ./config.yaml]
--url <URL> WebSocket URL of the iii engine [default: ws://127.0.0.1:49134]
--manifest Output module manifest as JSON and exit
-h, --help Print help
```

## Configuration

```yaml
scan_extensions: ["rs", "ts", "py", "js", "go"] # file extensions to include
max_file_size_kb: 512 # skip files larger than this
score_weights:
complexity: 0.25
coupling: 0.25
cohesion: 0.20
size: 0.15
duplication: 0.15
thresholds:
degradation_pct: 10.0 # dimension drop % that flags degradation
min_score: 60.0 # minimum passing score for quality gate
```

## Tests

```bash
cargo test
```
6 changes: 6 additions & 0 deletions sensor/build.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
fn main() {
println!(
"cargo:rustc-env=TARGET={}",
std::env::var("TARGET").unwrap()
);
}
11 changes: 11 additions & 0 deletions sensor/config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
scan_extensions: ["rs", "ts", "py", "js", "go"]
max_file_size_kb: 512
score_weights:
complexity: 0.25
coupling: 0.25
cohesion: 0.20
size: 0.15
duplication: 0.15
thresholds:
degradation_pct: 10.0
min_score: 60.0
Loading
Loading