Skip to content

v3.1.0 — GA: hardened for OT

Released: 2026-09-19 · General availability (first GA of the v3.1 line)

This is a general-availability release. No wire-format, envelope, or public-API changes from v3.1.0-beta.1 — v3.1.0 is the OT-safety hardening gate that takes SKI out of beta.

Install

pip install ski-sdk ski-kg-extractor ski-kg-validator ski-audit-ledger ski-model-deploy ski-schemas
docker pull ghcr.io/kpifinity/ski-model:3.1.0

Why GA now

The core has been fail-closed since beta.1. v3.1.0 makes that provable for OT/ICS deployment: every fail-safe path is tested and gated in CI, the highest-consequence OT threat has a conformance test, and the trust boundary is documented with a conservative default.

Highlights

Every fail-safe path is tested and gated

Per-module coverage assertions now sit on the safety-critical set — the verifier, the evaluator's degrade paths, kg_loader signature verification, the ledger client, and the risk-tier policy — on top of the global floor. There is an explicit negative test for every fail-closed branch: backend error, malformed model output, bad KG signature, unknown citation, and ledger-write failure. The guarantee is no longer "the guard exists" but "the guard is exercised and gated."

The OT attack that matters is now tested (threat T9)

A dedicated conformance test drives prompt-injection-via-telemetry: a compromised sensor/ETL source attempts to steer the reasoner into a fabricated CLEAR for a genuine breach. It must not silently CLEAR — it FLAGs or degrades. The test pins the structural guard rails (independent grounding against the measurement and the cited obligation, mechanical recomputation of satisfied, risk-tier downgrade of any disagreement) and is backed by a functional FakeLLM injection proof.

Fail-safe risk tiering + documented trust boundary

An absent, empty, or unrecognized risk_tier now defaults to tier-1 (any non-agreement → DISCRETIONARY + human attestation) rather than being trusted as lower-risk, and the coercion is audited. The effective tier is derived from the signed KG, not the caller-declared value. SKI's telemetry trust boundary is documented: integrity/authenticity are assumed enforced upstream; signed/authenticated telemetry and a trusted time source are recommended for OT.

Static analysis on the network-facing surface

Bandit now covers the sidecar (telemetry ingress), the telemetry buffer, and the KG tools, not just the core packages.

Conformance

82 conformance tests — 30 Provenance · 30 Durability · 22 Sovereignty (the sovereignty set now includes the T9 adversarial-telemetry test). Level 3 is fully runnable, including the air-gapped-boot CI rig.

Versioning note

ski-sdk and ski-schemas — versioned independently during the alpha/beta line under RFC 0003 — are unified to the framework version at GA. All six packages are 3.1.0.

Upgrade from v3.1.0-beta.1

No wire-format or API changes; drop the --pre flag:

pip install --upgrade ski-sdk ski-kg-extractor ski-kg-validator \
    ski-audit-ledger ski-model-deploy ski-schemas

See CHANGELOG.md.