The machine that produced sample-1.
This page has no marketing. Every service, schema, language, and technology below is traceable to a file in the repository. If the code changes, this page changes. If a claim here isn't in the code, remove it.
Source in. Signed ontology out.
Every artifact under /evidence/* is produced by exactly this pipeline. Each stage is a real service in services/. Stages communicate via NATS JetStream events (with idempotency guaranteed by per-service processed_events tables) and share PostgreSQL as the per-service system of record.
- 01
Gosource-intakereadsClient POST /v1/snapshots (multipart zip)writesMinIO/S3 object · NATS event snapshot.uploadedBoundary. Validates the archive, computes its content hash, persists to object storage, emits an event.
- 02
Rust · Tree-sitter · TokioparserreadsNATS snapshot.uploaded → downloads zip from MinIOwritesparsed_snapshots (Postgres) · IR JSON-Lines (MinIO) · NATS snapshot.parsedFor each file, detects the language and runs the matching Tree-sitter grammar (
tree-sitter-javascript,tree-sitter-typescript,tree-sitter-python,tree-sitter-rust,tree-sitter-go). Extracts a normalized IR —FileIR{ symbols[], imports[], calls[] }— writes it as JSONL to MinIO. No language-specific AST details leak past this stage. - 03
Rust · Postgres · Neo4jknowledge-graphreadsNATS snapshot.parsed → reads IR JSONL from MinIOwritesgraph_snapshots (Postgres) · file/symbol/import/call nodes and edges (Neo4j) · NATS snapshot.graph_builtPopulates the canonical ontology. Files, symbols, imports, and call edges become graph nodes and relationships in Neo4j via the
neo4rsdriver. The snapshot summary row (graph_snapshots) records loading counters and status. - 04
Go · PostgresdependencyreadsNATS snapshot.parsedwritesdependencies (Postgres, one row per dep) · NATS snapshot.deps_loadedExtracts direct dependencies per ecosystem (
npm,pypi,go,cargo,maven) from the manifest files. Deduped by(snapshot_id, ecosystem, name, manifest_path). - 05
Rust · Postgres · Neo4jdigital-twinreadsNATS snapshot.graph_builtwritescomponent_health per file · component_health_summary per snapshotComputes per-file metrics (LoC, symbols, fan-out, fan-in, imports) and the per-snapshot rollup (avg/max/p95 fan-out). This is the versioned, living layer of the ontology.
- 06
Go · PostgresverificationreadsNATS snapshot.graph_built + snapshot.deps_loadedwritesfindings (Postgres) · verification_runs · NATS snapshot.verifiedEvery finding is a query against the ontology + supporting evidence. Rows include
rule_id,agent,severity,confidence,evidence(JSONB), andverification_level∈ [0,5]. A unique index on(snapshot_id, rule_id, file_path, start_line)enforces deduplication. - 07
Go · PostgrespolicyreadsNATS snapshot.verifiedwritesverdicts (Postgres, exactly one per snapshot)Evaluates the org's policy document (JSONB) against the findings. Emits exactly one row per snapshot with
verdict∈{ pass, warn, block }, plusgate_results(per-condition JSONB breakdown) andby_severityrollup. This is whatverdict.jsonin sample-1 is derived from.
After the seven stages produce the pack, an Ed25519 JWS is written over the SHA-256 of every component file. The public key is published at /.well-known/jwks.json (kid = softinel-evidence-2026-07). The signing code is 40 lines of Go in tools/build-evidence/main.go — no external crypto dependency beyond the Go standard library.
These are the tables. This is the shape.
The ontology isn't abstract — it is a concrete set of PostgreSQL tables (plus mirrored Neo4j nodes/edges for graph queries). Below is the columns-that-matter view of each table, copied from the SQL under services/*/migrations/0001_init.up.sql.
parsed_snapshots
services/parser/migrations/0001_init.up.sqlsnapshot_idUUID · unique per uploaded archiveir_storage_keyMinIO key holding the IR JSONL blobfiles_parsedINT · files successfully parsedtotal_symbolsINT · symbols extracted across all filestotal_importsINTtotal_callsINT · intra-module call edgeslanguage_statsJSONB · counts per languagestatusparsed | partial | failed
graph_snapshots
services/knowledge-graph/migrations/0001_init.up.sqlsnapshot_idUUID · one-to-one with parsed_snapshotsfiles_loadedINTsymbols_loadedINTimports_loadedINTcalls_loadedINTexternal_modulesINT · imports pointing outside the workspacestatusbuilt | partial | failed
Individual nodes and edges live in Neo4j via the neo4rs driver — this table is the snapshot ledger.
dependencies
services/dependency/migrations/0001_init.up.sqlecosystemnpm | pypi | go | cargo | mavennameTEXTversionTEXT · exact resolved versionversion_rangeTEXT · manifest declarationmanifest_pathTEXT · where the declaration livesis_devBOOLis_optionalBOOL
Unique on (snapshot_id, ecosystem, name, manifest_path).
component_health
services/digital-twin/migrations/0001_init.up.sqlfile_pathTEXTlanguageTEXTlocINTsymbolsINTfan_outINT · outgoing CALLSfan_inINT · incoming CALLSimportsINT
Plus component_health_summary rollups: total_files, total_symbols, avg / max / p95 fan-out.
findings
services/verification/migrations/0001_init.up.sqlrule_idTEXT · e.g. SEC-EVAL-001agentsecurity | architecture | quality | performance | dependencyseveritycritical | high | medium | low | infoconfidenceDOUBLE PRECISION ∈ [0,1]file_path/start_line/end_linelocation — nullable for project-wide findingsevidenceJSONB · sources, extracts, reasoningverification_levelINT ∈ [0,5] · how deeply this was checkedstatusopen | acknowledged | resolved | dismissed | false_positive
Unique on (snapshot_id, rule_id, file_path, start_line) — same rule at same location doesn't double-count.
verdicts
services/policy/migrations/0001_init.up.sqlsnapshot_idUUID · exactly one verdict per snapshotverdictpass | warn | blockgate_resultsJSONB · per-condition satisfied/violated + detailtotal_findingsINTby_severityJSONB · rollup by severity
One row per snapshot — the UNIQUE constraint on snapshot_id enforces that.
Five languages today, via one grammar substrate.
The parser detects languages by extension and dispatches to the matching Tree-sitter grammar — the same substrate GitHub uses for code search. See services/parser/src/parser/languages.rs for the exact dispatch. Adding a language is a one-line change plus the grammar crate in Cargo.toml.
.ts, .tsx.js, .jsx, .mjs, .cjs.py, .pyi.rs.goSkip patterns (also in languages.rs) exclude node_modules, vendor, dist, build, target, .git, __pycache__, .venv, venv — so the ontology models what you wrote, not what package managers downloaded.
Boring, defensible, replaceable.
Rust
parser · knowledge-graph · digital-twinParsing millions of files is CPU-bound and memory-sensitive. Rust gives us zero-cost abstractions, no GC pauses, and a first-class Tree-sitter ecosystem. Async runtime: Tokio; web layer: Axum; SQL: sqlx (compile-time query verification).
Go
identity · gateway · verification · policy · dependency · orchestrator · reporting · billing · audit · tenant · projects · source-intake · remediationThe API-surface services. Chi router, pgx driver. Cheap deployment (single static binary), predictable memory, fast enough for every non-parser workload.
Python
agentsLanguage of the LLM/ML ecosystem. The agents service hosts language-model-driven checks — but never inside the decision path. Its outputs land in the same findings table with a lower verification_level until a higher-level pass promotes them.
PostgreSQL
every service · one database per serviceEvery ontology fact is a Postgres row somewhere. We reach for JSONB where the shape is heterogeneous (evidence, gate_results, policy document), and hard columns everywhere else. No shared schema across services — the process boundary is also the data boundary.
Neo4j
knowledge-graph · digital-twinGraph queries (reachability, transitive impact, cycle detection) are where relational query planners give up. Neo4j via neo4rs handles those. Postgres remains the ledger; Neo4j is the query surface.
NATS JetStream
every service · durable event streamStage-to-stage handoff. Each service subscribes to the events it cares about, records the event id in its processed_events table on first success, and skips on retry. Exactly-once semantics without a distributed transaction.
MinIO (S3-compatible)
source-intake · parserSnapshot archives and IR JSONL blobs — anything too big or too transient for a database. rust-s3 on the Rust side, AWS SDK on the Go side.
Ed25519 JWS
reporting · tools/build-evidenceThe signature over every evidence artifact. Small keys, small signatures, RFC 7515 compact serialisation. Public key published as JWK Set at /.well-known/jwks.json. See the acid-test proof at /evidence/sample-1.
Everything is signed. Nothing is post-editable.
The signature over an evidence artifact is Ed25519 over header.payload in JWS compact form. The payload commits to the SHA-256 of every component file. That means:
- → If the findings file changes by a single byte, the manifest's claimed hash no longer matches, and verification fails at that component.
- → If the JWS payload is re-forged with new hashes, the Ed25519 signature no longer verifies against the published key.
- → If the published key is replaced, the
kidin the JWS header no longer matches — verifiers refuse the signature explicitly rather than silently accepting the wrong key. - → Anyone can re-run the generator (
tools/build-evidence) locally, compare byte-for-byte, and hold us accountable for drift.
The honest state of the ontology.
Selling the vision is easy; being honest about the frontier is what earns trust. Today the ontology covers what's listed under Built. The rest is scheduled and traceable in rodemap.txt — but not yet in the model.
- Files, symbols, imports, and intra-module call edges across 5 languages.
- Direct dependencies from
package.json,requirements.txt,go.mod,Cargo.toml,pom.xml. - Per-file health metrics (LoC, fan-out, fan-in).
- Verification pipeline with structural + rule-based findings.
- Policy engine with configurable gates → verdict per snapshot.
- Signed evidence pack (Ed25519 JWS) verifiable in a browser or with openssl.
- Inter-service call graph (RPC / HTTP boundaries as edges).
- Data-flow analysis across function boundaries (currently rule-level).
- Transitive dependency resolution + license graph.
- Runtime signals (traces, error rates) as ontology facts.
- Deployment topology as first-class nodes.
- LLM agents promoting
verification_level0→1 findings to 2+ automatically.
If any item in the "Scheduled" column is on the site as if it were shipped today, treat it as a bug and tell us. Marketing debt is worse than technical debt.
Every claim here can be checked.
The pipeline above produced /evidence/sample-1. That artifact is Ed25519-signed. Every finding on it points to a real file:line in samples/vulnerable-web. Open the artifact, click "Verify signature", and every SHA-256 you see gets re-hashed in your browser and compared to the value committed by the signature.
If you want to reproduce the whole thing from source:
Connect your software. Softinel builds the model.
One canonical, connected model of your software. Every question about security, correctness, architecture, and change becomes a query against it — with evidence attached.