One product, four parts

Admission, Compare, an audit ledger and an enforcement hook: one stack that runs in your environment.

The four parts, in order

  • Admission and provenance

    Checks each model's licence and provenance before anyone can use it.

    How the gate decides

  • Compare

    Runs your own tasks against each candidate and scores the results.

    Compare

  • The tamper-evident ledger

    Records every request and decision in a chain that shows any tampering.

  • The enforcement hook

    Decides who may use which model, on every request.

    The enforcement hook

Capability status

Every public capability, with its status and evidence. In build and Claimed mean not available today; Shipped and Demonstrated mean the named evidence supports it. A hosted route carries provenance by host attestation, not verified; hosted routes are in build.

Capability status, from the claims register
Capability Status Evidence
CapabilityAdmission gate StatusShipped Evidencetools/admission-gate/gate.go
CapabilityProvenance artefact StatusShipped Evidencetools/admission-gate/attest.go
CapabilityLicence evidence StatusShipped Evidencetools/licence-diff/README.md
CapabilityCompare StatusDemonstrated Evidencesite/assets/poc/14-cross-environment-report-desktop.png
CapabilityHash-chained audit ledger StatusShipped Evidenceservices/audit/internal/ledger/verify.go
CapabilityEnforcement hook StatusShipped Evidenceservices/gateway/internal/gateway/authz.go
CapabilityIdentity proxy and virtual keys StatusShipped Evidenceservices/gateway/internal/gateway/identity.go
CapabilityFederation to a commercial identity provider StatusIn build Evidencedocs/decisions/0018-no-entra-tenant-poc.md
CapabilitySeverability: no phone-home, no kill switch StatusShipped Evidenceservices/gateway/internal/gateway/severed_test.go
CapabilityModel serving behind an OpenAI-compatible endpoint StatusDemonstrated Evidencedocs/reports/poc-screenshots/03-chat-reply-desktop.png
CapabilityRetrieval StatusDemonstrated Evidenceservices/knowledge/README.md
CapabilityDeployment pipeline StatusDemonstrated Evidencetools/deploy-pipeline/pipeline.go
CapabilityWeights verified by digest and signature StatusDemonstrated Evidencetools/verify-weights/weights.go
CapabilityHosted provider and frontier API routes StatusIn build Evidencedocs/decisions/0140-provider-neutral-execution-environments.md
CapabilityExport screening StatusClaimed Evidencedocs/decisions/0017-build-now-counsel-gates-delivery.md
CapabilityPer-environment load and SLO evidence StatusDemonstrated Evidencecompare-results/slo/local/20260926-022917/slo.json (a rig run against real vLLM, 502 requests, zero errors)

See it working

Three screens from the working product. The full flow walks every screen in order.

1. Admit

The candidates that did not pass, each beside the gate's own reason: a missing licence file, a clause that restricts use, an indemnity buried in a usage policy.

The held and rejected candidates behind their own control, each with the gate's verbatim reason: an age restriction and prohibited uses in a usage policy, and a licence-evidence hold where a repository metadata tag is not a grant.
Held and rejected, with the gate's own reason.
The same held and rejected candidates at 390px.

Rig capture: why the gate refused, not whether an admitted model suits your work.

2. Prove

A refused request shows its reason to the person who made it, and the same reason sits in the ledger with the policy revision that decided it.

One policy denial with its verbatim reason from the ledger, naming the subject and the model refused, with the policy revision from the gateway.
The refusal, with its reason.
The same denial row at 390px.

One refusal on the capture laptop; other refusal reasons are not shown.

3. The catalogue

The first screen after sign-in. Every record shows the licence, content digest, hardware fit and provenance recorded at admission.

The model catalogue as the default route after sign-in: admission counts, the held-and-rejected control, the five-axis filter console and the scan table.
The five-axis catalogue.
The same catalogue at 390px (the records table scrolls sideways).

The catalogue is not a digest check on deployed weights.

About these captures

Taken on a single capture laptop to show the flows. Performance and scale are measured in your pilot, on your hardware and your data. The models shown are the ones admitted there, not a recommendation. Sign-in uses a local identity stub; commercial federation is in build.

The Compare screens sit on the headline metric. For the rest, book a walkthrough: we drive the flows and answer your questions live.

The request path

Every request passes the same checks, in order, and nothing reaches the model without a decision.

  1. 01 Admission state Only admitted models are reachable.
  2. 02 Resolve the caller The identity proxy signs the caller in; their key reaches only admitted models.
  3. 03 Decide Policy allows or denies, and a deny carries its reason.
  4. 04 Serve The Agent Router forwards to the model and streams the answer back.
  5. 05 Record The ledger records the request before the answer, and cannot be skipped.

If the policy engine is unreachable, the answer is deny: an outage, never an open door.

The request path, and the identity-provider egress entry A client request crosses the front door, which routes to the Agent Router. The router asks the gateway enforcement hook, which consults the identity proxy and the policy engine, before it forwards to the model server, and reports the response afterwards; the hook forwards nothing. The hook writes through the audit writer, which appends to the ledger. With no provider enabled, the identity proxy is the only component with a route outside the environment, to your own identity provider. Your environment Client Front door Agent Router forwards Gateway enforcement hook Model server Identity proxy Policy engine Audit writer Ledger Identity provider The identity-provider egress entry Never established in severed mode

The audit ledger and its chain

Every request and decision becomes a row with content hashes (not content), token counts, the model digest and the policy revision. Rows link to each other, so removing or editing one is detectable.

How the chain holds
Mechanism What it prevents
MechanismCanonical payload and per-row hash What it preventsAn edited field changing the meaning of a row without changing its hash
MechanismA row lock on a single chain head What it preventsTwo concurrent writers forking the chain
MechanismInsert and select only, plus triggers on update, delete and truncate What it preventsQuiet rewriting, and the truncate case that row triggers never see
MechanismA write-ahead buffer, synced before the answer What it preventsTraffic served without a record. If the sink is down the buffer retains; if the buffer cannot persist, requests fail rather than proceed unlogged.
MechanismA signed head exported outside the ledger What it preventsRewriting history before the anchor, even with the privilege to rebuild the chain. The anchor records the head watermark too, because one anchor alone cannot see rows deleted after it was taken.

Governance as code

Policy is Rego in your own Git repository. The deploy pipeline stamps each bundle with its commit SHA, so every audit row cites the exact rules in force. A policy change is a deploy: a commit, a stage and a test run.

If the policy engine is unavailable, requests are denied and an alert fires. Every entitlement rule has a unit test, and a mutation harness checks the suite catches each deny gate being removed. Policy decides entitlement, not content; rate limits and budgets are the adopted substrate's.

Policy decision an example, not a live record

{
  "allow": false,
  "deny_reasons": ["model_not_entitled"],
  "policy_revision": "6c2a1f0"
}

Where it fits

Heliast governs the models you run, in your environment. Your coding tools point at an OpenAI-compatible endpoint inside it and keep working, and routing comes from a substrate we adopt, so what you pay for is admission, comparison and evidence.

Is this for you?