Architecture
August 25, 2026 ยท View on GitHub
ripr is one published package with strong internal module seams.
CLI / LSP / CI
-> app
-> analysis engine
-> domain
-> output adapters
Core modules
domain: probe, RIPR evidence, oracle strength, exposure classification.app: use-case orchestration and public library API.analysis: diff loading, syntax indexing, probe generation, classification.output: human, JSON, and GitHub annotation rendering.cli: command-line entrypoint.lsp: experimentaltower-lsp-serversidecar entrypoint.
Analysis scope
The analysis engine selects Rust files according to mode before building its syntax-first index:
instant: changed Rust files only.draft/fast: packages touched by the diff.deep/ready: all Rust files in the workspace.
This keeps live feedback narrow while preserving an explicit path to wider manual or CI scans.
Design rules
- Static objects are
Probes, not mutants. - Static output never says
killedorsurvived. - Unknowns are first-class outcomes.
- Findings must carry evidence and a recommended next step.
- The first release stays syntax-first. Semantic enrichment comes later.
- Behavior changes should preserve a spec-test-code trail so future humans and agents can recover intent from repository artifacts.
- Implementation modules should keep a single product responsibility: parsing, fact extraction, probe generation, classification, orchestration, or rendering.
Mechanical Guards
Run:
cargo xtask check-workspace-shape
cargo xtask check-architecture
cargo xtask check-public-api
These checks use policy metadata in policy/workspace_shape.txt,
policy/architecture.txt, and policy/public_api.txt to preserve the
one-package public surface and internal module boundaries.
See also:
Repository convergence control plane
Continuous source-to-swarm convergence is repository automation, not product analysis behavior and not a new published crate. Its accepted hexagonal boundary, capability split, source-of-truth direction, and mechanical guards are defined by RIPR-SPEC-0167.