IBM built the model. IBM built governance dashboards. SWT3 is the independent witness that proves what happened at inference time, on your hardware, with your data.
Who this is for: ML engineers deploying IBM Granite models locally or on watsonx.ai. Compliance leads governing open-weight models under EU AI Act, SR 11-7, or NIST AI RMF. Teams evaluating Granite for air-gapped or sovereign environments.
You download granite-4.2-30b.gguf. From that moment, you are the deployer under EU AI Act Art. 28. IBM's governance umbrella ended at the download. IBM cannot attest to what you did with those weights after they left their infrastructure.
IBM provides excellent governance tooling: watsonx.governance captures model metadata, FactSheets document lineage, Granite Guardian classifies safety risks. These tools record IBM's view of IBM's platform. But they cannot answer the questions auditors ask about your deployment:
SWT3 witnesses what actually happened at inference time. It does not replace watsonx.governance. It completes the evidentiary chain by adding the independent, cryptographic attestation layer that no vendor can provide about your own infrastructure. Together, IBM's tools and SWT3 give auditors the full picture. Apart, each has a blind spot.
| Model Family | Architecture | Sizes | Context | License | Deployment Formats |
|---|---|---|---|---|---|
| Granite 4.2 | Dense transformer | 3B, 8B, 30B | 128K | Apache 2.0 | watsonx.ai, Ollama, vLLM, GGUF, SGLang |
| Granite 4.1 Hybrid | Mamba-2 + Transformer MoE | 1B-32B (9B active) | 128K | Apache 2.0 | watsonx.ai, Ollama, vLLM, GGUF |
| Granite Guardian 4.1 | Dense classifier | 8B | 128K | Apache 2.0 | watsonx.ai, Ollama, vLLM |
| Granite Guardian HAP | HAP classifier | 38M, 125M | N/A | Apache 2.0 | CPU-deployable, any runtime |
| Granite Code | Dense transformer | 3B, 8B, 20B, 34B | 128K | Apache 2.0 | watsonx.ai, Ollama, vLLM, GGUF |
All Granite models are released under Apache 2.0, meaning the deployer assumes full governance responsibility upon download. The SWT3 granite-sovereign CLI profile is designed specifically for this scenario.
Which SWT3 adapter you use depends on how you serve Granite:
| Deployment | SWT3 Adapter | CLI Profile | Air-Gap Ready |
|---|---|---|---|
| watsonx.ai (cloud) | wrap_granite / wrapGranite | Default or custom | No (cloud API) |
| Ollama (local) | Existing OpenAI adapter (auto-detected) | granite-sovereign | Yes |
| vLLM (self-hosted) | wrap_vllm / wrapVllm | granite-sovereign | Yes |
| Docker / GGUF direct | Depends on serving layer | granite-sovereign | Yes |
Key point: If you run Granite via Ollama or vLLM, no new SDK code is needed. The existing OpenAI and vLLM adapters handle it automatically. The dedicated wrap_granite adapter is for the native ibm-watsonx-ai Python SDK only.
Each call to Granite produces a witness anchor containing the model identifier, prompt hash, response hash, latency, and token counts. No plaintext is stored. IBM's FactSheets record model metadata at deployment time. SWT3 witnesses what the model actually produced at inference time.
Query the witness ledger for AI-INF.1 anchors filtered by agent_id. Verify that anchor count aligns with expected inference volume. Compare model_id in anchors against the declared deployment manifest.
Open-weight models are distributed as files. Between IBM's release and your GPU, the weights pass through download mirrors, caches, and storage layers. SWT3's witness_model_weights() hashes the weight file at load time and mints an anchor proving the exact bytes that entered your inference pipeline. IBM publishes model cards. SWT3 witnesses that the weights you loaded match the published hash at the moment of inference.
Compare the weight hash in the AI-MDL.5 anchor against the SHA-256 published on Hugging Face or IBM's model card. A mismatch indicates the weights were modified after download.
Granite's Apache 2.0 license enables fine-tuning. When you apply LoRA or QLoRA adapters, the effective model changes. SWT3's witness_adapter_stack() records which adapters were active during inference, their checksums, and the merge strategy. IBM's governance stops at the base model. SWT3 witnesses the full stack that actually ran.
Query AI-MDL.6 anchors to verify adapter consistency across deployment windows. Look for unexpected adapter changes between audits.
Granite 4.2 ships in multiple quantization formats: FP8, MXFP4, NVFP4, Q4_K_M, Q8_0. Each trades accuracy for speed differently. SWT3's witness_quantization() records which variant was active during inference. The model card says "Granite 4.2 30B." SWT3 witnesses whether you ran Q4_K_M or FP8, which matters for accuracy-sensitive workloads.
Verify AI-MDL.7 anchors show the quantization variant that matches the deployment specification. Flag any drift from the declared variant.
Granite Guardian is a separate model that classifies safety risks in prompts and responses. When you run Guardian alongside Granite, call witness.witness_guardrail() to record each Guardian verdict as an anchor. The granite-sovereign profile lists AI-GRD.1 as a required procedure, meaning missing Guardian evidence is flagged automatically. IBM built Guardian. SWT3 witnesses that you actually ran it.
Query AI-GRD.1 anchors. Verify the guardrail name is "Granite Guardian" and that anchor frequency matches AI-INF.1 inference anchors (every inference should have a corresponding Guardian check).
Granite Guardian HAP (Hate, Abuse, Profanity) models are lightweight classifiers that can run on CPU alongside any Granite deployment. When deployed as a content filter, each HAP classification result can be witnessed as a separate AI-GRD.2 anchor. IBM trained the HAP classifier on curated datasets. SWT3 witnesses that it was active in your pipeline.
Verify AI-GRD.2 anchors exist for content-sensitive deployments. Check that HAP classification was applied to both prompts and responses.
Granite Guardian 4.1 includes prompt injection detection as a built-in risk category. When Guardian flags a prompt injection attempt, witness the detection result with witness_adversarial_detection(). IBM built the detector. SWT3 records every detection event as tamper-evident evidence.
Query AI-SEC.1 anchors for detection events. Verify that the detection method references Granite Guardian and that flagged inputs were handled according to policy.
The granite-sovereign profile requires hardware attestation. Call witness.witnessHardware() at service startup to record which GPUs executed Granite inference. For sovereign deployments, TPM 2.0 attestation binds the evidence chain to specific physical hardware. IBM cannot attest to your hardware. SWT3 witnesses it.
Verify AI-HW.1 anchors list expected GPU topology. For sovereign deployments, confirm TPM attestation is present and PCR values match the declared baseline.
Granite's Apache 2.0 license permits modification and redistribution, but the deployer must maintain attribution. SWT3's witness_license() records the license type, attribution status, and any modifications applied to the original weights. The license file ships with the model. SWT3 witnesses that your deployment honors it.
Verify AI-LIC.1 anchors confirm Apache 2.0 license type and that attribution requirements are documented.
An AI SBOM for Granite includes: base model version, tokenizer configuration, adapter stack, quantization format, serving runtime version, and dependency chain. SWT3's witness_sbom() captures this inventory as a witnessed artifact. IBM publishes model cards. SWT3 witnesses the complete stack that actually ran in production.
Verify AI-SBOM.1 anchors list all components. Cross-reference against IBM's published model card for the declared base model.
watsonx.governance includes fairness monitoring with demographic parity and disparate impact metrics. SWT3's witness_bias_detection() records each fairness evaluation result as a witnessed anchor. watsonx.governance monitors fairness on IBM's platform. SWT3 witnesses that you ran those checks and records the results independently.
Query AI-FAIR.1 anchors. Verify that fairness evaluations were conducted at the declared frequency and that results are consistent with watsonx.governance reports.
watsonx.governance tracks model drift against baselines. SWT3's witness_drift_detection() records each drift measurement as a witnessed anchor. watsonx.governance detects drift on its platform. SWT3 witnesses that drift monitoring is active and records the measurements independently of any vendor dashboard.
Query AI-DRIFT.1 anchors. Verify drift monitoring is continuous and that threshold breaches triggered the declared response procedures.
IBM documents Granite's training data in published technical reports and model cards. For fine-tuned variants, the deployer's training data introduces new provenance requirements. SWT3's witness_data_provenance() records dataset identifiers, processing steps, and consent status for any additional training applied after download.
Verify AI-DATA.1 anchors for fine-tuned models. Cross-reference dataset identifiers against data governance documentation.
Granite deployments via Docker, Kubernetes, or vLLM run in isolated environments. SWT3's environment witnessing records container image digests, runtime versions, and isolation boundaries. The deployment manifest says "isolated." SWT3 witnesses the actual runtime configuration.
Verify AI-ENV.2 anchors reference specific container image digests. Cross-reference against the declared deployment architecture.
EU AI Act Art. 50(2) requires that AI-generated content be labeled for machine detectability. SWT3's witness_content_marking() records when Granite output was marked with provenance metadata (C2PA, watermark, or metadata tags). Compliance requires marking. SWT3 witnesses that marking actually happened.
Query AI-MARK.1 anchors. Verify that the marking method is consistent with the declared content provenance strategy.
Between IBM's model hub and your inference server, weights travel through CDNs, registries, and storage systems. SWT3's supply chain witnessing records the download source, transport integrity, and any intermediary caches. IBM released the weights. SWT3 witnesses the chain of custody from release to your GPU.
Verify AI-SUPPLY.1 anchors trace the weight download path. Confirm the source matches IBM's official distribution channels.
| Procedure | Granite 4.2 | Granite 4.1 Hybrid | Guardian | Code Models |
|---|---|---|---|---|
| AI-INF.1 Inference Provenance | ✓ | ✓ | ✓ | ✓ |
| AI-MDL.5 Weight Integrity | ✓ | ✓ | ✓ | ✓ |
| AI-MDL.6 Adapter Stack | ✓ | ✓ | ✓ | |
| AI-MDL.7 Quantization | ✓ | ✓ | ✓ | |
| AI-GRD.1 Guardrail | ✓ | ✓ | ✓ | ✓ |
| AI-GRD.2 Content Safety | ✓ | ✓ | ✓ | |
| AI-SEC.1 Adversarial Detection | ✓ | ✓ | ✓ | |
| AI-HW.1 Hardware Attestation | ✓ | ✓ | ✓ | ✓ |
| AI-LIC.1 License Provenance | ✓ | ✓ | ✓ | ✓ |
| AI-SBOM.1 AI Bill of Materials | ✓ | ✓ | ✓ | ✓ |
| AI-FAIR.1 Bias Detection | ✓ | ✓ | ||
| AI-DRIFT.1 Model Drift | ✓ | ✓ | ✓ | |
| AI-DATA.1 Training Data | ✓ | ✓ | ✓ | ✓ |
| AI-ENV.2 Runtime Isolation | ✓ | ✓ | ✓ | ✓ |
| AI-MARK.1 Content Marking | ✓ | ✓ | ✓ | |
| AI-SUPPLY.1 Supply Chain | ✓ | ✓ | ✓ | ✓ |
Python
from swt3_ai import Witness
from swt3_ai.adapters.granite import wrap_granite
from ibm_watsonx_ai import Credentials, APIClient
from ibm_watsonx_ai.foundation_models import ModelInference
witness = Witness(
endpoint="https://sovereign.tenova.io/api/v1/witness",
api_key="axm_live_...",
agent_id="granite-risk-model",
)
credentials = Credentials(url="https://us-south.ml.cloud.ibm.com", api_key="...")
model = ModelInference(model_id="ibm/granite-3-8b-instruct",
credentials=credentials, project_id="...")
witnessed = wrap_granite(model, witness) # or witness.wrap(model)
response = witnessed.generate(prompt="Summarize the quarterly risk report.")
# Response is untouched. Anchor minted silently in the background.
witness.flush()
TypeScript
import { Witness } from "@tenova/swt3-ai";
import { wrapGranite } from "@tenova/swt3-ai/adapters/granite";
const witness = new Witness({
endpoint: "https://sovereign.tenova.io/api/v1/witness",
apiKey: "axm_live_...",
agentId: "granite-risk-model",
});
// Assuming watsonx SDK client is initialized
const witnessed = wrapGranite(model, witness); // or witness.wrap(model)
const response = await witnessed.generate({ prompt: "Summarize the quarterly risk report." });
// Response is untouched. Anchor minted silently in the background.
await witness.flush();
Python
from swt3_ai import Witness
from openai import OpenAI
witness = Witness.from_config("granite-sovereign")
client = OpenAI(base_url="http://localhost:11434/v1", api_key="ollama")
witnessed = witness.wrap(client) # Auto-detects Ollama, uses OpenAI adapter
response = witnessed.chat.completions.create(
model="granite3.1-dense:8b",
messages=[{"role": "user", "content": "Summarize the quarterly risk report."}],
)
witness.flush()
Four lines of witness code. Every inference now has a tamper-evident anchor. The granite-sovereign profile automatically requires signing, hardware attestation, and Guardian evidence.