Portfolio
Navi Sohi: portfolio projects
Small, working systems that govern what AI agents may do. Every claim on these pages comes from a result that is committed in the repository and can be reproduced. What is simulated, unmeasured or not built is shown next to the numbers, not hidden.
Index
Projects
Edge Sentinel
Governed agents that act on the physical world
A decision cascade for an ESP32 sensor: a local hard limit, then Jev, then an LLM only when Jev is unsure. The model proposes; a fixed policy table decides how risky it is.
- 35 unit tests passing
- Firmware compiles (CI builds it)
- Simulated sensor data
- Never run on a board
- Live Jev and Haiku comparison: 48 readings
Blast Door
Know the blast radius before you press the button
Runbooks as typed state machines: a dry-run proof before every write, a deterministic verifier the planner cannot argue with, a second-person approval, and a loop that survives a process kill without repeating a write. Simulated environment.
- 185 offline tests passing
- Crash matrix: 30 of 30 kill points
- Environment SIMULATED
- No live LLM planner
- CI on Python 3.11 and 3.12 (result: Actions tab)
Whetstone
A sparring partner for AI agents
Attack success rate treated as an engineering measurement: deterministic oracles, paired seeds, false positives beside catch rates. A real model (run once) resisted all 165 attacks; the simulated 50.5% is an author assumption, not a finding.
- 587 offline tests passing (latest CI run)
- Simulated sandbox, tools and data
- Simulated target by default
- Real model run once: Claude Haiku 4.5, 0/165
- Adaptive attacker: full experiment not finished
- Defensive scope only
Jev Agent Router
Keyword vs LLM vs Jev: accuracy and latency, measured
On 111 hard hand-written messages (3 runs): keywords 42%, Jev 98% at 116 ms median, Claude Haiku 99% at 607 ms median. Accuracy of the two models is within noise; cost is not measured.
- 10 unit tests passing (latest CI run)
- Live Jev and Haiku runs on 2026-10-05, 3 runs
- Hand-written data, one annotator
- Cost not measured
SignalWeave AI
Six specialist agents, one deterministic policy gate, human-owned decisions
A policy-gated decision pipeline for technical programs: six narrow specialists, a deterministic gate, comparable options. Offline by default, synthetic data only, and it records no approvals.
- 48 tests passing (counted locally)
- Latest CI run passed (checked)
- Synthetic data only
- Default mode: rule sets, no model called
- Approve button records nothing
- Audit panel is sample data
switchboard
A git-native ticket router for a fleet of specialist AI agents
A one-shot ticket router for AI agents: tag-overlap first, a model only on zero overlap and only when asked. Corrections are recorded; risk tiers only warn.
- 78 tests passing offline (counted locally)
- Latest CI run passed (checked)
- Tests mock the model (SWITCHBOARD_MOCK=1)
- Jev backend tested offline only
- Risk tiers are advisory
- Livery comparison: author's own, unverified
Critical Path Radar
Dependency intelligence that separates schedule risk from visible noise
CPM forward and backward pass over Jira dependency links, checked against a textbook answer. Not an agent, no LLM: it says whether a stalled item can actually move the end date.
- 10 unit tests passing
- CPM checked against a textbook network
- CI green on the latest commit when checked
- No LLM anywhere in the repo
- Self-created Jira links (3), not simulated
- Jira reading code has no tests
Agent Control Tower
Policy, budget, approval, and audit controls for autonomous agents
Retrofit governance for agents that already exist: a declarative action policy, a pre-call budget check, single-use expiring approvals and a hash-chained audit log. A prototype, not an enforcement boundary.
- 42 unit tests passing (latest CI run)
- 5 committed audit events
- Prototype: opt-in, not an enforcement boundary
- Retrofit claims partly unverified
- No approver identity or authentication

IT Agent Platform
Approval-first automation for modern IT operations
Propose, approve, execute as three separate audited steps: six specialist agents propose typed actions, a deterministic policy decides which need a different person to approve. A reference implementation with a mock executor, not a production control plane.
- 16 tests passing (latest CI run)
- Mock executor: no real system touched
- Reference implementation, not production
- Approver identity unauthenticated
- No live connector built
Executive Status Rollup
Rules decide the status, Claude only narrates it
A weekly RAG rollup from live Jira data: the status comes from unit-tested rules, Claude only writes the prose, and a week-over-week history makes a flip visible.
- 9 unit tests passing
- CI green on the latest commit when checked
- Live Jira data (PGMAUTO), not simulated
- Slack post ungoverned if agent-control-tower is not importable
- Narration vs status not checked in code
- No eval of the narration
Incident Postmortem Agent
Blameless incident synthesis, prompted to refuse to invent causality
A single-call postmortem drafter with a five-fixture grounding eval. The saved run scored 4 of 5 and the one fail was the grader returning an empty tool call; the page says so.
- Eval 4 of 5 fixtures (single run)
- 13 offline tests passing (with requirements-dev.txt)
- CI green on the latest commit when checked
- Five synthetic fixtures (simulated threads)
- One Claude call, no check at generation time
- Live proof: one hand-posted incident
Slack Daily Brief
A Slack brief with an eval harness that caught its own hallucinations
A daily Slack summariser whose eval harness caught invented owners and severity: 5 of 10 fixtures passing before the prompt fix, 9 of 10 after, each a single run.
- Eval 50% to 90% (single runs, 10 fixtures)
- 9 unit tests passing (tracking.py only)
- CI green on the latest commit when checked
- Synthetic fixtures (simulated transcripts)
- Posts to Slack with no approval gate
- No budget cap set
Inbox Marshal
Inbox hygiene with reversible automation by default
A deterministic pipeline with one LLM classifier step: scan changes nothing, apply confirms first, auto files labels only. Never deletes. Classification quality has no evaluation set yet.
- 14 unit tests passing (latest CI run)
- Never deletes
- Classification quality not measured
- Auto mode has no human approval
- Classifier and Gmail client untested
Spec Review Agent
Parallel pre-build review across ambiguity, feasibility, privacy, completeness, and ownership
Five narrow critic calls review a spec in parallel; plain Python merges the findings into a severity-ranked report. One real-document demo, and the critics themselves are unmeasured.
- 10 unit tests passing (report rendering only)
- Latest CI run passed (checked)
- One real-document demo, one run
- Critics not evaluated
- Claude calls not tested offline
tpm-agent-os
Ambiguity in. Structure, risk, and a decision out.
A fixed six-stage pipeline for ambiguous program briefs: framing, risk map, build-vs-buy panel, status, redirect-or-kill, playbook. Independent lenses plus a judge, and no human gate.
- 12 tests passing offline (counted locally)
- Latest CI run passed (checked)
- Tests use canned fixtures (TPM_AGENT_MOCK=1)
- No human gate
- No evaluation of live output
muster
A git-native AI team you run locally
A local, no-database launcher for AI coding agents with per-runtime verification status, git worktree isolation and durable attempt records. Assignment is manual by design; risk tiers only warn.
- 51 tests passing offline (counted locally)
- Latest CI run passed (checked)
- 6 runtimes verified live, 2 documented only
- Risk tiers are advisory
- Success check proves a change exists, not that it is right
- No production mileage
Enterprise PM Automation System
Governed Jira Epic intake and lifecycle automation, with modeled impact
Jira Epic intake and lifecycle automation as a rules engine. Impact figures are a modeled scenario, not telemetry, and the README admits capacity enforcement is design-only and there are no tests.
- Impact figures are modeled, not measured
- Status: reference implementation
- No automated tests (no tests/ directory)
- No CI workflow
- Capacity limits: design only, not in app/
- BRD gate advises; a Jira rule does the block
Taskloom
A local-first visual control plane for teams of AI agents
A local-first desktop control plane for teams of AI agents: four autonomy policies decide whether output may touch a file, every write is snapshotted first, and state survives restarts. v0.12.0, with CI and 114 automated tests; model output is faked in the tests.
- 114 automated tests: 77 Python/MCP + 37 React
- CI: last run on main passed when checked
- Release v0.12.0
- Model output is simulated in the tests
- Not signed or notarized
- Needs Python 3 and Ollama installed
mac-ai-apps
Native macOS menu bar apps that use a local LLM
Three native macOS menu bar apps on a local Ollama model: Lint (clipboard cleaner), Pulse (Jira sprint brief) and MicDrop (voice dictation and commands). Tried by hand only: no automated tests, no CI, not packaged.
- 3 native macOS apps: Lint, Pulse, MicDrop
- No automated tests, no CI
- Tried by hand only
- MicDrop is a work in progress
- Not packaged or notarized
- macOS 15.5 target not built here
TARMAC
The Enterprise Delivery Control Plane
An early-stage reference implementation of an IT portfolio governance layer, with its own product site. Today it runs on hardcoded sample data: integrations with Jira, ServiceNow and Azure DevOps are not built, and nothing is persisted. What does run is a unit-tested lifecycle and launch-gate rules engine. This card links to the existing TARMAC site, not to a generated page.
- Early-stage reference implementation
- Sample data only (hardcoded)
- Jira, ServiceNow, Azure DevOps: not built
- No persistence yet
- Lifecycle rules engine unit-tested
- CI: last run on main passed when checked