— ad conformitatem legis de intelligentia artificiali —
Konsonans AI GovernanceFormal governance specification
A formal account of the Konsonans AI Governance platform: a membrane-typed policy DSL compiled to capability-sandboxed WASM components, an append-only tamper-evident audit spine, human-in-the-loop oversight, and a small live orchestration — arranged as numbered propositions for conformity with the EU AI Act.
substrate · glither.* (roux/tangle) · wasm32-wasip2 · pharo 12 · postgresql 16
status · design draft, non-normative · risk-class · high (annex III)
Preface — what may be governed at all
The Act asks an operator to make the conduct of a high-risk AI system traceable, overseen, and demonstrable. This document holds that these are not procedures bolted onto a system but structural properties of how the system is built.
whereof one can compile, thereof one can attest
The book treats a single thesis: a compliance obligation is best discharged by an architecture in which the obligation cannot structurally be violated, rather than one in which it is merely promised and later inspected.
Its form is propositional: cardinal propositions 1…7 carry the argument; decimal propositions elaborate so that each claim has an address and each mechanism a place.
Each cardinal closes with the product feature it justifies — its why and its what — so the document reads simultaneously as philosophy of the design and as a product specification.
The seven cardinals: 1 the world under the Act · 2 the membrane & the DSL · 3 the tamper-evident spine · 4 human oversight · 5 the small orchestration · 6 composition & attestation · 7 the limit — fail-closed.
What can be said about an agent's conduct can be said in a derived contract; what cannot be said there — an authority not granted, a guarantee not satisfiable — is not stalled at runtime but refused at compile time.
The world of an agent is everything that is the case — and the Act asks for its record
An AI agent's world is the totality of its actions, not of its intentions. Governance is the discipline of which actions may cross into effect, in what state, and on whose record.
art. 9 · risk management — art. 12 · logging
The world is the totality of agent actions, not of agent code. A model's weights are opaque; its actions are discrete, typed, and namable — and therefore governable.
An action is an artifact attempting to cross a boundary: approveLoan:, denyClaim:, placeOrder:. Each is a candidate fact about the world.
To govern is to interpose a membrane between the action and its effect, and to decide each crossing: admit, refuse, or suspend pending a human.
The Annex III categories — credit, recruitment, medical, law-enforcement, critical infrastructure, education — fix which worlds are high-risk. Risk classification (art. 9) is the prior act of naming the world.
Classification is itself a typed object: a risk-profile with a level on the lattice minimal < limited < high < unacceptable and the required measures it implies.
That a thing happened must be recordable independently of the agent that did it (art. 12). The record is not a log file the agent writes; it is a witness the agent cannot edit.
Risk classifier
risk-profile derived per agent session, fixing the SLA, oversight, and logging measures the rest of the platform enforces.Action capture
A policy is a contract over a membrane — and the contract is derived, not declared
Rules are written in Glither, a membrane/ligand DSL. The compiler derives the component's WIT world from the rules, so the published contract is the compiled one. Authority not named in a rule does not exist for that component.
glither.governance · roux / tangle · wasm32-wasip2
A rule selects actions by their properties and disposes of them into a terminal state or a suspended one. The selectors are the boundary; the disposition is the verdict.
A ligand is a property a rule needs but does not itself possess — a risk level, an approval flag, a PII verdict. A ligand required but not produced is an unsatisfiable guard.
The keystone. An unsatisfiable guard becomes a WIT import with no provider; the component fails to link. An incoherent policy is a compile error, never a silent runtime gap.
// glither.governance — a high-value action must hold for a human rule human_review_high_value_loan = action | agent_class == "LoanApprovalAgent" | action.name == "approveLoan:" | action.arguments[1] > 25000 | not action.has_human_approval // ⟨ligand · attested · audited⟩ => hold into human_review // suspended: Pending<{allowed, blocked}> on reviewer.approved into allowed on reviewer.denied into blocked (reason = human_denied) after 15m into blocked (reason = sla_exceeded) // art. 14 §4 — the safe default on timeout is refusal
The same grammar (roux) hosts many dialects. A dialect is a vocabulary plus host bindings — never a new compiler. glither.governance for the Act; glither.hft for pre-trade risk; glither.mail for mailguard.
Because dialects share lattices, an unlawful information down-flow across a rule is the same type error in each — Denning's lattice, enforced once.
From one typed IR the compiler emits two artifacts: a production Rust component and an auditable Gleam oracle. They must agree byte-for-byte on every conformance case; divergence is a compiler bug.
The Gleam oracle is the document's quiet hero for the Act: a small, readable, independently-runnable reference a notified body can audit without trusting the build toolchain.
The compiled component has authority only through its WIT imports. No sockets, no filesystem, no clock unless a host binding grants it. The capability sandbox is the product, not a setting.
Rules-as-DSL
.glith ruleset; the WIT contract and minimum capability set are derived, so the published policy is the running one.Differential oracle
The record is append-only, hash-chained, and witnessed by independent replicas
An event is never mutated, only appended; each entry hashes its predecessor; and a synchronous replica — ideally third-party — holds an independent copy whose divergence is itself the evidence of tampering.
art. 12 · logging — art. 72 · post-market monitoring
State changes are events, never updates. The store enforces this: UPDATE and DELETE are refused at the database rule level, not merely by convention.
Each entry carries previous_hash and a signature = SHA-256(id ‖ time ‖ action ‖ previous_hash). The chain makes any insertion, deletion, or reordering detectable from the hashes alone.
One copy can be rewritten by whoever holds it. Therefore the record streams — synchronously — to a second host whose only role is to re-verify the chain as rows arrive.
With synchronous_commit = remote_apply the agent's action is not acknowledged until a replica has the event. The tamper window — the gap in which a compromised primary could rewrite-then-ship — is closed.
Two replicas give a majority: where primary and replicas disagree, the diverging node is identified, not merely the fact of divergence.
The strongest replica is one the operator does not control: an independent auditor node that signs a daily manifest over the chain's first and last hash. Leak-freeness toward it is structural — see proposition 6 (Dana).
A backup proves what you had; a witnessed chain proves what you cannot have changed. The Act asks for the second.
Append-only event store
Divergence detector
A high-stakes crossing suspends until a person decides — and silence means refusal
Human oversight is not a notification after the fact. It is a suspended state in the membrane: the action waits, a reviewer decides with a recorded rationale, and an expired deadline resolves to blocked, never to allowed.
art. 14 · human oversight — art. 14 §4 · safe default
The suspended disposition hold into human_review is a real state with a liveness obligation: it carries a deadline, and its only lawful settlements are allowed or blocked.
The reviewer acts on a typed surface, not a chat message: the action, its arguments, its risk flags, the offending policy, and the audit entry's hash with its chain status.
A decision is itself an event: {reviewer, decision, rationale, decided_at} — appended to the chain. Oversight is auditable as conduct in its own right.
Art. 14 §4, structurally. When the SLA expires the rule's after arm fires into blocked. The system defaults to the safe state by construction; an absent human cannot become a tacit approval.
The SLA is a function of risk: tighter for high, looser for limited. The deadline is data, not policy buried in code.
The reviewer works inside a live Smalltalk image (proposition 5): the queue, the inspector, and the decision controls are one running object graph, observable and modifiable while live.
Oversight gateway
Approval widget
The conductor is small, live, and inspectable — a witness one can hand to an auditor
Orchestration is a Pharo Smalltalk image: an event bus, a session registry, transport proxies, and the reviewer IDE — held as one running object graph that can be frozen and inspected at the moment of a disputed decision.
pharo 12 · spec2 · event-sourced projections
The orchestrator does little and shows everything. It routes captured actions to the membrane, suspends for oversight, appends to the spine, and projects live documents — and no more.
Agents connect over the transport that fits them: a unix socket for a co-located model, tcp+mTLS for a container, HTTP/SSE for a remote function. One wire protocol (JSON-RPC 2.0) underneath.
Live documents are projections of the event stream. A compliance dashboard is not generated nightly; it advances as events arrive, by subscription, not by polling.
The image is the witness. A regulator can be handed a snapshot of the exact runtime state at the moment in question and inspect every object and replay every decision with no tooling beyond Pharo.
The heavy, sandboxed work lives in WASM; the live, inspectable work lives in the image. The split is deliberate: provable isolation where authority matters, live malleability where humans look.
Live orchestrator
Governance IDE
The whole deployment is a typed graph, signed, and provably one-way where it must be
Components compose into a membrane graph via glither.world; an unsatisfiable wiring is a compose-time failure. Edges to a witness are Dana: one-way by construction, with a signed no_retrograde vow a third party can check.
glither.world · wac compose · dana / no_retrograde
The deployment is not a diagram; it is a typed object. glither.world selects components and guards each Pour → Pier wiring against the same discipline the inner rules use.
The keystone lifts to the graph: an edge whose types do not satisfy makes the composition fail. An unsound deployment does not start.
A Dana membrane imports but exports nothing that carries data back to the donor — a passive uniport, no retrograde channel, no side-channel. The audit replica is exactly this.
The vow is checkable, not asserted: a Dana world declares no donor-facing export, so the absence of a back-channel is visible in the signed contract the component compiles against.
The signed graph attestation records, per edge, the negotiated guarantee and flags every Dana edge — so a third party can verify the whole deployment's information-flow shape from signed artifacts alone.
// glither.world — audit store pours one-way into independent replicas rule audit_to_replicas = edge | donor.dialect == glither.audit_store | pier in replica_nodes | pier.attested.no_retrograde // ⟨Dana vow · audited⟩ => link pour to pier into linked
Membrane-graph compose
glither.world ruleset lowered to a wac composition; unsatisfiable wiring is refused at compose time.Dana attestation
no_retrograde predicate over the component's WIT world and hash; verifiable from artifacts alone.Whereof one cannot prove compliance, thereof one must fail closed
The platform's final commitment is negative and absolute: where a guarantee cannot be satisfied, an authority cannot be granted, or a witness cannot be reached, the system does not proceed degraded — it refuses.
default-deny · fail-closed · the keystone, everywhere
A missing host binding is a link failure, not a silent degraded mode. A missing required ligand is a typed, audited guard-fail, never an exception that leaks.
An expired oversight deadline resolves to refusal (4.2). An unsatisfiable wiring fails the compose (6.11). An unverifiable Dana vow rejects the edge (6.21).
These are one principle in many places: the unsafe path is made unrepresentable or unreachable, so that compliance is the only state the system can occupy.
This is why the document is a specification and not a checklist: a checklist enumerates what one must remember to do; an architecture fixes what one cannot fail to do.
What can be governed has been said in the contract. Of the rest — the unsatisfiable, the ungranted, the unwitnessed — the system must be silent, and silence here is refusal.
| Article | Prop. | Requirement | Mechanism |
|---|---|---|---|
| Art. 9 | 1.2 · 1.21 | Risk-management system | RiskClassifier; typed risk-profile on the level lattice |
| Art. 10 | 2.1 | Data governance / minimisation | glither.governance PII guard rule; argument scrubbing |
| Art. 11 | 2.3 · 2.31 | Technical documentation | Derived WIT contract; auditable Gleam oracle; compliance report |
| Art. 12 §1 | 3.1 · 3.11 | Logging of events | Append-only event store; SHA-256 hash chain |
| Art. 12 §2 | 3.11 | Retention ≥ 6 months | PostgreSQL + WORM cold archive |
| Art. 13 | 1.3 · 4.11 | Transparency to deployers | Typed audit entries; reviewer surface; query interface |
| Art. 14 | 4.1 · 4.11 | Human oversight | Oversight gateway; hold into human_review; approval widget |
| Art. 14 §4 | 4.2 | Safe default on inaction | after SLA → into blocked in every hold rule |
| Art. 47 | 6.3 | Declaration of conformity | Signed graph attestation; per-edge guarantee record |
| Art. 72 | 3.2 · 5.2 | Post-market monitoring | Divergence detector; live event-sourced dashboard |
The parts and what each is for
A reading of the platform as a parts list — each sub-component named with the substrate it is built on and the proposition it serves.
check · snapshot · wit · build · oci · conform. Turns a .glith ruleset into a signed, digest-pinned WASM component. Serves 2.1–2.4.dispose, collects the receipt, drops the instance. The binding set is the only authority. Serves 2.4 · 7.1.glither.governance membrane: audit, policy, oversight, document. Published to registry.ragbaz.cc, cosign-signed. Serves 2 · 4.agent-proxy (MCP) path; the Pharo image is a study and inspection surface, not load-bearing. Serves 5 · 4.3.status · design draft, non-normative · not legal advice · compliance core in active implementation (live status ↗) · a conformity argument to be ratified with a notified body.
substrate · glither.* (roux/tangle/glither-wit/glither-host) · wasm32-wasip2 · rust agent-proxy (mcp) · postgresql 16 · pharo 12 (optional) · cosign
author · RAGBAZ — Tobias Abenius · regulation · EU 2024/1689 · applies from 2026-08-02