Skip to content

Architecture

The bounded projection kernel in one picture, then the pieces. Depth lives in the framework reference — this page tells you which document to open.

The kernel in one diagram

System of record FHIR server · repository tool registry · your DB owns durable state Adapter hydrate a declared, versioned closure PRP-008 snapshot horismos-core — the kernel (no network, no model) Ontology (.ttl) — verified classes · constraints · rules · workflow · tool contracts Gate 5 checks World typed facts Rules fixed point Proof + trace truth maintenance: every transaction re-chains to the fixed point of its base facts deterministic · no wall-clock · trace equality is a test assertion Perception — LLM text → typed instances, schema-forced, confidence-gated, fallback edge required proposes the gate decides Narration — LLM proof → prose for an audience; never written back Your tools — fired by the runtime when preconditions hold arguments read from the graph · effects validated through the gate · never chosen by a model preconditions effects Adapter conditional commit: fails closed on drift PRP-008 effects commit receipt or conflict appended to the trace — no cross-system atomicity claim

Solid boxes are merged today. Dashed boxes are the host-integration mechanism owned by PRP-008: hydrate a declared, versioned closure into an all-or-nothing snapshot; run the unchanged kernel over it; commit a typed proposed effect set back only if the source still matches the recorded versions. Nothing inside the kernel box performs a network read, ever — that is the anti-wrapper boundary, enforced mechanically (make check-boundary, make no-model-gate).

One transaction, end to end

text ──Bridge──▶ JSON (schema-forced) ──gate──▶ base facts
                                                  │ forward chain (Rete-lite, in-core)
                                                  ▼
                                        derived facts + proofs
                                                  │ constraint re-check
                                                  ▼
                              commit ── snapshot ── trace append ── subscribers

Everything after the Bridge call is allocation-light Rust over interned IRIs. Python and (planned) WASM hand a whole input over and get a whole outcome back — there is no cross-language chatter inside a transaction, a lesson measured in the sigil-lang project this framework inherits from.

The pieces and where they live

Piece Crate / package Read
Turtle parsing, RDFS-plus profile validation, schema and subsumption, imports and anchoring horismos-core::ontology The Ontology
The typed instance store, five-check gate, provenance, snapshots, diff, binary form, queries horismos-core::world The World
Rule model, the 11 condition operators, naive and Rete-lite matchers, forward and backward chaining, proof trees horismos-core::reason Reasoning
The workflow interpreter (Agent), step types, tool contracts and effect validation horismos-core::workflow Workflows, Tools
The Bridge trait — a pure interface, no provider code horismos-core::bridge The Bridge, LLM Boundaries
horismos.trace/1 and /2, emission, migration policy horismos-core::trace Traces
BDD verification with witnesses, assumption manifest, non-vacuity horismos-core::verify (PRP-005) Verification
MockBridge (the CI workhorse) and OpenRouterBridge (feature bridges-openrouter) horismos-bridges The Bridge
PyO3 extension — marshaling only, no logic horismos-py Python API
The horismos Python package: naming sugar over the native handle python/horismos Python API
FHIR and coding-harness adapters, host SPI (ExternalSnapshot, ProposedEffectSet) new crates outside horismos-core (PRP-008) PRPs/PRP-008-standards-host-integration.md

The invariants that make it a kernel

  • Anti-wrapper boundary. horismos-core never depends on horismos-bridges, a provider SDK, or the network. make no-model-gate builds and tests the core with --no-default-features --features verify; make check-boundary greps the manifest. Red means the "runs with the LLM deleted" claim broke.
  • Determinism. No wall-clock, randomness, or hash-order dependence in inference. horis:now is stamped once per transaction. Two runs of the same input produce byte-identical trajectories, and the test suite asserts it.
  • One vocabulary end to end. The CURIEs an author writes are the CURIEs the API takes, the errors print, and the proofs render. No second naming system in the bindings (a generated-proxy design was prototyped and rejected on evidence; PRPs/PRP-003-python-bindings/03-decision-instances.md).
  • Whole inputs in, whole outcomes out. Each Python call is one transaction: gate, chaining, fixed point, diff, all under one lock acquisition with the GIL released.
  • Two wire contracts, versioned forever. The trace schema evolves only by minting a new version with a converter; the snapshot binary form has a versioned header.
  • One world per case. A World is a serial transaction stream; parallelism is many worlds sharing one immutable Ontology. Under the projection model, one world per decision epoch.

Performance posture

Triage-scale targets (about 50 rules, hundreds of facts): gate-plus-chain transaction under 1 ms, prove/explain under 1 ms, load-plus-verify under 1 s, perception overhead under 5 ms on top of the model call. Criterion benchmarks are tracked from PRP-002 onward; adapter I/O is measured separately and never blended into kernel numbers. Scaling beyond that is measured, not promised — see Architecture internals.

Go deeper

Concepts for the nouns and the two principles; Architecture internals for the crate layout, the dependency invariant, and the concurrency model; Security & Trust for the five trust boundaries and what each one leaves to the deployer.