Risk assessment for codebases using theory of mind.
intratom occupies the interpretive space between user and machine — the place Norbert Wiener spent his career mapping in Cybernetics. Every interface is an interpreter. intratom asks, for each interpretation site in your code: does this surface keep its commitments to the user, and where could it quietly fail to?
intratom walks a codebase, picks out the places where the system commits to telling a user something or doing something on their behalf, and scores each of them along five failure modes:
| # | Mode | What it means |
|---|---|---|
| 1 | Crash | The program terminates abnormally. |
| 2 | Hang | The program stops making progress without exiting. |
| 3 | Silently disappear | The system appears to work while the underlying state has stopped advancing. The user only finds out later. |
| 4 | Mislead | The interface asserts something it has no right to assert. |
| 5 | Fail to show | A feature exists; the surface fails to expose it to the user who needs it. |
Modes 1 and 2 are easy — crashes and hangs self-report. Modes 3, 4, and 5 are where intratom earns its keep. They are anti-correlated with crash reporting; conventional static analysis cannot see them. Detecting them needs reading, with theory of mind for the user.
intratom is radically functional. Every stage of the pipeline is a function, and pipelines are composed by passing functions to other functions — Volterra-style. You add new failure modes, new selectors, new scoring backends by composing in new functions, not by editing the engine.
Codebase
|> Selector (pick interpretation sites)
|> Refiner (filter / enrich / add context)
|> ModeScorer* (one per failure mode you care about)
|> Scorer (combine via a backend — Claude, Gemini, local, hybrid)
|> Aggregator (roll up to file / module / repo)
=> Report
Every arrow is Fn(...) -> .... No hidden state. No mutation. New modes slot in. New backends slot in. The pipeline is itself a value you can pass around.
v0 — the trait scaffold is in. The Claude backend is stubbed; selectors and refiners are minimal. The smoke binary walks a codebase and counts files. Real selection, scoring, and aggregation land in the next commits.
cargo build
cargo run -- --root /path/to/codebaseintra + tom. intra because we occupy the interpretive space rather than observe it from outside (inter); tom for theory of mind. The work happens inside the interpretation gap between user and machine, which is where the failures live.
Dual-licensed under MIT or Apache-2.0 at your option.