This is version 1.0 of the SWT3 Protocol Specification, published August 2026 by Tenable Nova LLC.
Normative sections of this specification are versioned. Breaking changes to normative sections increment the major version number. Additive extensions that do not alter existing normative requirements increment the minor version number. The UCT Registry governance process is documented in Section 19.
The fingerprint algorithm (Section 7), anchor format (Section 6), and clearing level definitions (Section 9) are locked as of this version. Implementations conforming to version 1.0 will remain compatible with all future 1.x versions of this specification.
This specification is published by Tenable Nova LLC as the protocol's originating organization. As multi-stakeholder adoption progresses, governance of the SWT3 protocol, UCT Registry, and test vector suite is expected to transition to a multi-stakeholder body. Organizations contributing to the protocol's development, implementation, or adoption are invited to participate in shaping its governance structure.
Patent pending.
This specification defines the SWT3 (Sovereign Witness Traceability) protocol for generating, signing, and verifying cryptographic witness anchors. A witness anchor is a deterministic, independently verifiable attestation record computed from observed operational facts.
This specification covers:
This specification does NOT cover:
The SWT3 protocol is industry-agnostic, framework-neutral, and designed for cross-language interoperability. It operates independently of any specific AI provider, cloud platform, or regulatory regime.
The following documents are referenced normatively in this specification. For dated references, only the edition cited applies. For undated references, the latest edition applies.
| Reference | Title |
|---|---|
| RFC 2119 | Key words for use in RFCs to Indicate Requirement Levels (Bradner, 1997) |
| RFC 6234 | US Secure Hash Algorithms (SHA and SHA-based HMAC and HKDF) (Eastlake & Hansen, 2011) |
| RFC 2104 | HMAC: Keyed-Hashing for Message Authentication (Krawczyk, Bellare & Canetti, 1997) |
| FIPS 204 | Module-Lattice-Based Digital Signature Standard (ML-DSA) (NIST, 2024) |
| ISO 8601:2019 | Date and time format |
| RFC 4648 | The Base16, Base32, and Base64 Data Encodings (Josefsson, 2006) |
For the purposes of this specification, the following terms and definitions apply. The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC 2119.
| Term | Definition |
|---|---|
| Witness Anchor | A deterministic, cryptographically verifiable attestation record encoding observed operational facts as a structured token string. |
| Fingerprint | A 12-character hexadecimal string derived from the SHA-256 hash of a domain-separated input containing tenant identity, procedure identifier, factors, and timestamp. |
| Factor | A numeric value (integer) encoding an observed operational measurement. Each witness anchor contains exactly three factors: factor_a, factor_b, and factor_c. |
| Clearing Level | An integer (0-3) specifying the information density permitted in a witness payload. Higher clearing levels progressively remove metadata before transmission. |
| Procedure | A named operation in the Universal Control Taxonomy (UCT) that a witness anchor attests to. Identified by a dotted-namespace format (e.g., AI-INF.1). |
| UCT | Universal Control Taxonomy. The namespace registry that defines all valid procedure identifiers, organized by domain. |
| Tenant | An organizational entity whose identity is bound into the fingerprint computation. Tenants are isolated; cross-tenant fingerprint collision is computationally infeasible. |
| Enclave | A deployment environment containing one or more witnessed systems. Enclave integrity is computed from the collective fingerprints of all anchors within it. |
| Lifecycle Chain | A sequence of related witness anchors linked by a shared chain identifier, representing a multi-stage operation (e.g., emergency override initiation through resolution). |
| CJT Fields | Compliance Jurisdiction and Traceability metadata fields that survive all clearing levels: jurisdiction, legal_basis, purpose_class, agent_id, and cycle_id. |
| Verdict | The binary outcome of a witnessed operation: PASS or FAIL. Verdict evaluation logic is procedure-specific and defined by the implementing platform, not by this specification. |
This is version 1.0 of the SWT3 Protocol Specification, published August 2026 by Tenable Nova LLC.
Normative sections of this specification are versioned. Breaking changes to normative sections increment the major version number. Additive extensions that do not alter existing normative requirements increment the minor version number. The UCT Registry governance process is documented in Section 19.
The fingerprint algorithm (Section 7), anchor format (Section 6), and clearing level definitions (Section 9) are locked as of this version. Implementations conforming to version 1.0 will remain compatible with all future 1.x versions of this specification.
This specification is published by Tenable Nova LLC as the protocol's originating organization. As multi-stakeholder adoption progresses, governance of the SWT3 protocol, UCT Registry, and test vector suite is expected to transition to a multi-stakeholder body. Organizations contributing to the protocol's development, implementation, or adoption are invited to participate in shaping its governance structure.
Patent pending.
The SWT3 protocol operates in three phases:
Phase 1: Witness. An observed operational fact (e.g., an AI inference, a guardrail evaluation, a model integrity check) is captured as three numeric factors with associated metadata.
Phase 2: Mint. A witness anchor is deterministically computed from the factors, tenant identity, procedure identifier, and timestamp. The anchor is optionally signed with HMAC-SHA256 or ML-DSA-65. Clearing is applied to remove metadata according to the specified level before transmission.
Phase 3: Verify. Any party with knowledge of the input components can independently recompute the fingerprint using standard SHA-256 and compare it to the anchor's claimed fingerprint. No proprietary tooling, API access, or platform account is required for verification.
The protocol is architecturally neutral. It does not prescribe how evidence is collected, where anchors are stored, or how verdicts are evaluated. These concerns are delegated to the implementing platform.
A witness anchor token is a hyphen-delimited string with the following structure:
SWT3-{TIER}-{PROVIDER}-{UCT}-{PROCEDURE}-{VERDICT}-{EPOCH}-{FINGERPRINT}
| Field | Description | Type | Constraints |
|---|---|---|---|
SWT3 | Protocol identifier | Literal | Always the string SWT3 |
TIER | Deployment tier | Char(1) | E (Enclave), S (SaaS), H (Hybrid) |
PROVIDER | Infrastructure provider | String | VULTR, AWS, AZURE, GCP, HYBRID, ON-PREM, or other registered provider codes |
UCT | Universal Control Taxonomy domain | String | 2-4 uppercase alphanumeric characters (e.g., ACC, NET, AI) |
PROCEDURE | Procedure identifier (normalized) | String | Namespace prefix stripped, hyphens and periods removed (e.g., AI-INF.1 becomes AIINF1) |
VERDICT | Binary outcome | Literal | PASS or FAIL |
EPOCH | Timestamp | Integer | Unix epoch in seconds |
FINGERPRINT | Evidence fingerprint | Hex(12) | First 12 characters of the SHA-256 fingerprint (Section 7) |
SWT3-E-VULTR-AI-AIINF1-PASS-1774800000-2e16e2fe92dd
Decomposition:
| Segment | Value | Meaning |
|---|---|---|
SWT3 | Protocol | SWT3 protocol anchor |
E | Tier | Enclave deployment |
VULTR | Provider | Vultr infrastructure |
AI | UCT | AI/ML governance domain |
AIINF1 | Procedure | AI-INF.1 (Inference Provenance) |
PASS | Verdict | Operation passed |
1774800000 | Epoch | Unix timestamp (seconds) |
2e16e2fe92dd | Fingerprint | SHA-256 derived, 12 hex chars |
The fingerprint MUST be computed as follows:
fingerprint = SHA256("WITNESS:{tenant_id}:{procedure_id}:{factor_a}:{factor_b}:{factor_c}:{timestamp_ms}").hex()[:12]
Where:
| Component | Type | Description |
|---|---|---|
WITNESS | Literal string | Domain separation prefix. REQUIRED. |
tenant_id | String | Tenant identifier (e.g., ENCLAVE_PROD) |
procedure_id | String | Original procedure ID with full punctuation (e.g., AI-INF.1) |
factor_a | Integer | First factor, rendered as a decimal string (e.g., 1, 5000) |
factor_b | Integer | Second factor, rendered as a decimal string |
factor_c | Integer | Third factor, rendered as a decimal string |
timestamp_ms | Integer | Millisecond-precision Unix epoch, rendered as a decimal string |
:, U+003A) separators.0 is rendered as "0". The integer 5000 is rendered as "5000".WITNESS MUST be uppercase.Implementations MUST also support verification against the legacy formula for backward compatibility with anchors minted before version 1.0:
fingerprint_legacy = SHA256("{procedure_id}:{tenant_id}:{factor_a}:{factor_b}:{factor_c}:{timestamp_ms}").hex()[:12]
The legacy formula differs from the canonical formula in two ways: (1) the WITNESS:
domain separation prefix is absent, and (2) the procedure_id and tenant_id
fields are in reversed order.
When verifying an anchor, implementations MUST attempt the canonical formula first. If verification fails, implementations MUST attempt the legacy formula before reporting a verification failure.
When minting new anchors, implementations MUST use the canonical formula exclusively.
The fingerprint algorithm is fully deterministic. Given identical inputs, any conforming implementation in any programming language MUST produce an identical fingerprint. This property is verified by the test vectors in Section 18.
Every witness anchor contains exactly three factors:
| Factor | Field Name | Type | Description |
|---|---|---|---|
| A | factor_a | Integer | First measurement dimension |
| B | factor_b | Integer | Second measurement dimension |
| C | factor_c | Integer | Third measurement dimension (context, delta, or method code) |
Factor semantics are procedure-specific. This specification defines the factor structure but does not prescribe procedure-level semantics. Procedure-specific factor definitions are maintained in the UCT Registry (Section 15).
The following common evaluation patterns are observed across procedures:
factor_a = required/expected valuefactor_b = measured/observed valuefactor_c = additional context (delta, method code, or boolean flag)factor_b >= factor_a implies PASSfactor_a = count of items (e.g., adapters, chunks, guardrails)factor_b = verification status (1 = verified, 0 = not verified)factor_c = method or context codefactor_b >= 1 implies PASSfactor_a = maximum allowed value (e.g., latency threshold)factor_b = observed valuefactor_c = contextfactor_b <= factor_a implies PASS820 with a documented scale factor of 1000).0 is semantically valid and distinct from absent.The clearing protocol defines four levels of information density control. Higher levels progressively remove metadata from the witness payload before transmission.
| Level | Name | Description |
|---|---|---|
| 0 | Analytics | All metadata retained. Full forensic capability. |
| 1 | Standard | Raw evidence purged after factor extraction. Hashes, model identity, and context retained. Default level. |
| 2 | Sensitive | Hashes and model identity retained. All contextual metadata removed. |
| 3 | Classified | Factors only. Model identity hashed. All other metadata destroyed. |
The following table specifies which payload fields survive each clearing level. "Y" = retained, "N" = destroyed before transmission.
| Field | Level 0 | Level 1 | Level 2 | Level 3 |
|---|---|---|---|---|
procedure_id | Y | Y | Y | Y |
factor_a, factor_b, factor_c | Y | Y | Y | Y |
clearing_level | Y | Y | Y | Y |
anchor_fingerprint | Y | Y | Y | Y |
anchor_epoch | Y | Y | Y | Y |
fingerprint_timestamp_ms | Y | Y | Y | Y |
ai_prompt_hash | Y | Y | Y | N |
ai_response_hash | Y | Y | Y | N |
ai_system_prompt_hash | Y | Y | Y | N |
ai_model_id | Y | Y | Y | N (hashed) |
ai_latency_ms | Y | Y | N | N |
ai_input_tokens | Y | Y | N | N |
ai_output_tokens | Y | Y | N | N |
ai_context | Y | Y | N | N |
payload_signature | Y | Y | Y | Y |
signing_key_id | Y | Y | Y | Y |
jurisdiction | Y | Y | Y | Y |
legal_basis | Y | Y | Y | Y |
purpose_class | Y | Y | Y | Y |
agent_id | Y | Y | Y | Y |
cycle_id | Y | Y | Y | Y |
lifecycle_chain_id | Y | Y | Y | Y |
lifecycle_stage | Y | Y | Y | Y |
The following Compliance Jurisdiction and Traceability (CJT) fields MUST survive all clearing levels (0 through 3):
jurisdiction (ISO 3166-1 alpha-2 country code)legal_basis (e.g., GDPR legal basis reference)purpose_class (processing purpose classification)agent_id (AI agent identity string)cycle_id (multi-agent interaction chain link)Implementations MUST NOT clear CJT fields regardless of clearing level. These fields are required for regulatory traceability across jurisdictions.
When hashing prompt, response, or system prompt content for inclusion in the witness payload:
hash = SHA256(text).hex()[:16]
The hash MUST be the first 16 characters of the lowercase hexadecimal SHA-256 digest of the UTF-8 encoded text.
When hashing ai_model_id at clearing level 3:
hashed_model_id = SHA256(ai_model_id).hex()[:16]
Clearing is irreversible. Once metadata is destroyed at the source, it cannot be recovered, reconstructed, or reverse-engineered from the remaining fields. This property is by design and provides a sovereignty guarantee: raw evidence (prompts, responses, operational data) never leaves the developer's infrastructure at clearing level 1 or above.
The default signing algorithm is HMAC-SHA256 (per RFC 2104).
Without agent identity binding:
signature = HMAC-SHA256(signing_key, anchor_fingerprint)
With agent identity binding:
signature = HMAC-SHA256(signing_key, anchor_fingerprint + ":" + agent_id)
Where + denotes string concatenation and ":" is the literal colon
character (U+003A).
The signing_key is a shared secret known to the minting party. It MUST NOT be
transmitted in the witness payload.
The signing_key_id field in the payload identifies which key was used, enabling
key rotation without invalidating existing anchors.
Implementations MAY support ML-DSA-65 (FIPS 204) as an alternative signing algorithm for post-quantum resistance.
ml-dsa-65When signing_algorithm is ml-dsa-65:
signature = ML-DSA-65-Sign(private_key, message)
Where message follows the same construction rules as HMAC-SHA256 (fingerprint alone,
or fingerprint:agent_id).
Verification is performed using the public key derived from the same seed:
valid = ML-DSA-65-Verify(public_key, message, signature)
Because ML-DSA-65 signatures are non-deterministic, cross-implementation parity is verified by round-trip testing (sign with implementation A, verify with implementation B) rather than exact signature comparison.
Model trust profiles MUST be signed using the following canonical message format:
message = "PROFILE:{model_id}:{model_hash}:{generated_at}:{valid_until}:{sorted_procedures}:{coverage_score_3dp}"
Where:
sorted_procedures is a comma-separated list of procedure IDs sorted lexicographicallycoverage_score_3dp is the coverage score rounded to 3 decimal places (e.g., 0.667)signing_key_id and signing_key_version fields enable rotation without invalidating existing anchors.To verify a single witness anchor:
tenant_id, procedure_id, factor_a, factor_b, factor_c, fingerprint_timestamp_ms.No API access, platform account, or proprietary tooling is required for verification. Any party with knowledge of the input components can perform verification using standard SHA-256.
To verify the integrity of an entire enclave (collection of anchors):
"fp1:fp2:fp3:...".SHA256(joined_string).hex() (full 64-character hexadecimal digest).The enclave integrity signature has the following property: identical anchors in an identical state always produce an identical signature. Any addition, removal, or modification of any anchor changes the signature.
If the witness payload includes a payload_signature:
signing_algorithm field (default: hmac-sha256).anchor_fingerprint (or anchor_fingerprint:agent_id if agent_id is present).signing_key_id.Signature verification is independent of fingerprint verification. An anchor can be VERIFIED (fingerprint matches) but UNAUTHENTICATED (signature does not match), or vice versa.
The following fields MUST be present in every witness payload:
| Field | Type | Description |
|---|---|---|
procedure_id | String | UCT procedure identifier (e.g., AI-INF.1) |
factor_a | Integer | First factor |
factor_b | Integer | Second factor |
factor_c | Integer | Third factor |
clearing_level | Integer | 0, 1, 2, or 3 |
anchor_fingerprint | String(12) | Computed fingerprint (Section 7) |
anchor_epoch | Integer | Unix epoch in seconds |
fingerprint_timestamp_ms | Integer | Millisecond timestamp used in fingerprint computation |
| Field | Type | Description |
|---|---|---|
ai_model_id | String | Model identifier (e.g., gpt-4o) |
ai_prompt_hash | String(16) | SHA-256[:16] of the prompt text |
ai_response_hash | String(16) | SHA-256[:16] of the response text |
ai_system_prompt_hash | String(16) | SHA-256[:16] of the system prompt |
ai_latency_ms | Integer | Inference latency in milliseconds |
ai_input_tokens | Integer | Input token count |
ai_output_tokens | Integer | Output token count |
ai_context | String | Freeform context (cleared at level 2+) |
agent_id | String | AI agent identity |
cycle_id | String | Multi-agent interaction chain identifier |
payload_signature | String(64) | HMAC-SHA256 signature (hex) |
signing_algorithm | String | hmac-sha256 (default) or ml-dsa-65 |
signing_key_id | String | Key identifier for rotation support |
signing_key_version | Integer | Key version number |
policy_version_hash | String | Hash of the governance policy version |
jurisdiction | String | ISO 3166-1 alpha-2 country code |
legal_basis | String | Legal processing basis (e.g., Art. 6(1)(f)) |
purpose_class | String | Processing purpose classification |
authorization_id | String | Pre-inference gate authorization identifier |
references | Array | Related anchor fingerprints |
revocation_target | String | Fingerprint of the anchor being revoked |
revocation_reason | Integer | Revocation reason code (0-6) |
lifecycle_chain_id | String | Lifecycle chain identifier (Section 13) |
lifecycle_parent | String | Parent anchor fingerprint in the chain |
lifecycle_stage | String | Current lifecycle stage |
escalation_chain_id | String | Cross-chain escalation link |
| Code | Meaning |
|---|---|
0 | unspecified |
1 | model_recall |
2 | policy_violation |
3 | data_contamination |
4 | consent_withdrawal |
5 | regulatory_order |
6 | error_correction |
procedure_id MUST be a valid UCT procedure identifier.clearing_level MUST be an integer in the range [0, 3].anchor_fingerprint MUST be exactly 12 lowercase hexadecimal characters.anchor_epoch MUST be a positive integer.fingerprint_timestamp_ms MUST be a positive integer.lifecycle_chain_id, if present, MUST match the pattern ^LC-[0-9a-f]{16}$.A lifecycle chain identifier links multiple witness anchors into a single operational sequence. The chain ID is computed as:
chain_id = "LC-" + SHA256("LIFECYCLE:{tenant_id}:{procedure_id}:{initiator_fingerprint}:{timestamp_ms}").hex()[:16]
Where:
tenant_id is the tenant that initiates the chainprocedure_id is the procedure of the initiating anchorinitiator_fingerprint is the fingerprint of the first anchor in the chaintimestamp_ms is the millisecond timestamp of the initiating anchor
The chain ID is a fixed-length string: the literal prefix LC- followed by 16
lowercase hexadecimal characters.
The following canonical stage codes are defined:
| Stage | Code | Terminal |
|---|---|---|
initiated | 0 | No |
checkpoint | 1 | No |
escalated | 2 | No |
resolved | 3 | Yes |
abandoned | 4 | Yes |
superseded | 5 | Yes |
lifecycle_stage set to initiated.lifecycle_chain_id of the initiating anchor.lifecycle_parent field SHOULD contain the fingerprint of the immediately preceding anchor in the chain.
When an event in one lifecycle chain triggers a new chain (e.g., a drift detection escalates to an
emergency override), the new chain's initiating anchor SHOULD include the
escalation_chain_id field referencing the originating chain.
Organizations that provide AI models to third parties (whether through open-weight distribution, API access, cloud platform hosting, or embedded integration) face a common challenge: demonstrating that downstream deployers are operating the model with appropriate controls, without accessing the deployer's infrastructure or proprietary data.
A model provider MAY mint delegation anchors (procedure AI-DEL.1) to formally record the relationship between the provider's tenant and one or more deployer tenants.
The delegation anchor encodes:
factor_a: Number of deployer tenants in the delegation scopefactor_b: Number of required procedures in the delegation policyfactor_c: Delegation type code (0 = open-weight, 1 = API, 2 = cloud platform, 3 = embedded)The evidence aggregation model preserves deployer sovereignty:
A deployer building applications on models from multiple providers uses a single SWT3 integration. The same anchors, minted under the deployer's tenant, can be referenced by any provider with an established delegation relationship. This eliminates the need for deployers to maintain separate compliance systems per provider.
The delegation mechanism is identical regardless of how the model reaches the deployer:
| Distribution Model | Example | Delegation Type Code |
|---|---|---|
| Open-weight | Model weights distributed for local deployment | 0 |
| API access | Model served via inference API | 1 |
| Cloud platform | Model hosted on provider's cloud infrastructure | 2 |
| Embedded | Model integrated into provider's application | 3 |
The Universal Control Taxonomy (UCT) defines the namespace for all valid procedure identifiers. As of version 1.0, the taxonomy contains 114 AI-specific procedures organized across 62 namespaces.
Procedure identifiers follow the format AI-{NAMESPACE}.{NUMBER} for AI-specific
procedures. The following namespaces are defined:
INF, MDL, GRD, SEC, RAG, SKILL, TOOL, ID, ACC, REV, FAIR, DATA, HITL, EXPL, CHAIN, VIO, CHR, SAFE, HW, TRUST, FIN, GOV, ENV, MARK, BASE, LIC, SBOM, REDTEAM, CONSENT, MULTI, DRIFT, AUDIT, INCIDENT, PMM, PERF, ROBUST, CYBER, TRANS, WATERMARK, DPIA, AUTO, DUALUSE, SUPPLY, METAGOV, DEL, CAP, COST, JUR, LCM, LOG, IMPACT, MOB, EMRG, ASSESS, ENG, REACH, DECOM, RECOMM, FREEZE
Non-AI procedures use domain-specific prefixes (e.g., SC-7.6 for network security,
AC-2.1 for access control).
Published namespace codes are never removed, renamed, or redefined. New namespace codes require demonstrated need across two or more regulatory frameworks. The UCT Registry is the authoritative source for all procedure definitions and is publicly available.
Each procedure in the UCT Registry is mapped to one or more regulatory framework requirements through bidirectional crosswalks. As of version 1.0, crosswalks are maintained for 36 regulatory frameworks across 12 jurisdictions.
This specification defines three conformance levels:
An implementation at Level 1 MUST:
An implementation at Level 2 MUST satisfy all Level 1 requirements and additionally:
An implementation at Level 3 MUST satisfy all Level 2 requirements and additionally:
An implementation conforms to this specification at a given level if and only if it satisfies all MUST-level requirements for that level and all levels below it. Conformance is independently verifiable via the test vectors in Section 18.
An implementation that satisfies some but not all requirements of a given level MUST NOT claim conformance at that level. It MAY claim conformance at the highest level for which all requirements are satisfied.
Fingerprints are 12 hexadecimal characters (48 bits of entropy from the SHA-256 output). This truncation is intentional: fingerprints serve as evidence identifiers, not as security tokens. The full SHA-256 digest is not needed because:
Clearing levels provide information density control, not encryption. Clearing at level 1+ ensures that raw prompts, responses, and operational data never leave the developer's infrastructure. However, the metadata that does survive (hashes, factors, model identifiers at levels 0-2) could be correlated with external data sources by a sufficiently motivated adversary.
Organizations processing highly sensitive data SHOULD use clearing level 2 or 3.
The WITNESS: prefix in the fingerprint formula provides domain separation, preventing
cross-protocol collision. The following domain separation prefixes are reserved by this specification:
| Prefix | Usage |
|---|---|
WITNESS: | Fingerprint computation |
LIFECYCLE: | Lifecycle chain ID computation |
PROFILE: | Model trust profile signing |
SWT3:LEAF: | Merkle tree leaf hashing |
SWT3:NODE: | Merkle tree node hashing |
Implementations MUST NOT use these prefixes for other purposes.
All conforming implementations MUST produce identical outputs for the following test vectors. The
complete test vector suite is available at test-vectors.json in the reference
implementation repository.
Formula: SHA256("WITNESS:{tenant}:{proc}:{fa}:{fb}:{fc}:{ts_ms}").hex()[:12]
| ID | Tenant | Procedure | fa | fb | fc | Timestamp (ms) | Expected |
|---|---|---|---|---|---|---|---|
| 1 | ENCLAVE_PROD | AI-INF.1 | 1 | 1 | 0 | 1774800000000 | 2e16e2fe92dd |
| 2 | AWS_NITRO_ENCLAVE | AI-INF.2 | 5000 | 8000 | 1 | 1774800001000 | 4ed784765e6c |
| 3 | ENCLAVE_PROD | AI-GRD.1 | 2 | 3 | 0 | 1774800002000 | a0aa7669ae6f |
| 4 | AZURE_TRUSTED_EXEC | AI-MDL.1 | 1 | 0 | 1 | 1774800003000 | c36d477b3c2d |
| 5 | ACME_DEFENSE | AI-FAIR.1 | 15 | 15 | 0 | 1774800004000 | 53180f5ae221 |
| 6 | SAAS_TENANT_42 | AI-MDL.2 | 1 | 1 | 0 | 1774800005000 | c7e61c16ee94 |
| 7 | AWS_NITRO_ENCLAVE | AI-EXPL.2 | 85 | 92 | 0 | 1774800006000 | 2f2b989bb5c6 |
| 8 | ENCLAVE_PROD | AI-HITL.1 | 1 | 1 | 0 | 1774800007000 | afbab8c9e098 |
| 9 | DEMO_ENCLAVE | AI-INF.3 | 10000 | 9500 | 0 | 1774800008000 | 05010820e5a4 |
| 10 | AZURE_TRUSTED_EXEC | AI-DATA.1 | 0 | 0 | 0 | 1774800009000 | 289eb7452237 |
The complete test vector suite contains 55 fingerprint vectors covering edge cases (all-zero
factors, large values, multiple tenant types, all clearing levels). See test-vectors.json
for the full set.
Algorithm: HMAC-SHA256. Key: test-signing-key
| ID | Fingerprint | Agent ID | Expected Signature |
|---|---|---|---|
| 1 | 019eaf85fcba | agent-007 | 00ff82da1659e2e6a7fa875c781ed4635976c8136b8dc2c24672adb8673cb112 |
| 2 | 019eaf85fcba | (none) | d844102f40fb5dad449a2f57922f5b23f73ffb3a026b5bd5fd537ebe5c6c44d0 |
Vector 1 message: 019eaf85fcba:agent-007
Vector 2 message: 019eaf85fcba
Formula: SHA256(input).hex()[:16]
| Input | Expected |
|---|---|
Hello, world! | 315f5bdb76d078c4 |
| (empty string) | e3b0c44298fc1c14 |
What is the meaning of life? | 318f903a83b4d30d |
gpt-4o-2024-11-20:fp_abc123 | 0f6b04241d237297 |
You are a helpful fraud detection assistant. Flag any transaction over $10,000. | 479eaa1ee804f844 |
| Field | Value |
|---|---|
| Model | gpt-4o |
| Hash | abc123 |
| Procedures | AI-GRD.1, AI-INF.1, AI-MDL.1 |
| Score | 0.667 |
| Generated At | 1700000000000 |
| Valid Until | 1700086400000 |
| Expected Message | PROFILE:gpt-4o:abc123:1700000000000:1700086400000:AI-GRD.1,AI-INF.1,AI-MDL.1:0.667 |
Signing key: test-key-123
Expected HMAC-SHA256: bdce7111c3a6e9968a5de1973f3a977aadb42c2d7327f38de79729019c7baa42
Note: Procedures in the message MUST be sorted lexicographically.
ML-DSA-65 signatures are non-deterministic. Conformance is verified by round-trip testing:
60ef3bf0e31e764953cf67c6806d0c6512ce54a6e83a9328b7042b3896cf8f40 (32 bytes, hex).019eaf85fcba:agent-007. The signature will differ on each invocation.019eaf85fcba (without agent_id). Verification MUST succeed.Formula: "LC-" + SHA256("LIFECYCLE:{tenant}:{proc}:{fp}:{ts_ms}").hex()[:16]
| ID | Tenant | Procedure | Initiator FP | Timestamp (ms) | Expected Chain ID |
|---|---|---|---|---|---|
| 1 | ENCLAVE_PROD | AI-EMRG.1 | 2e16e2fe92dd | 1774800000000 | LC-7a38936db8ecec94 |
| 2 | ENCLAVE_PROD | AI-DRIFT.2 | 4ed784765e6c | 1774800001000 | LC-60c720a257e2d3b9 |
| 3 | AWS_NITRO_ENCLAVE | AI-ASSESS.1 | 66209137510b | 1774800010000 | LC-9caadba335ca64cd |
The following domain separation prefixes are reserved by this specification and MUST NOT be used by implementations for other purposes:
| Prefix | Usage | Section |
|---|---|---|
WITNESS: | Fingerprint computation | 7 |
LIFECYCLE: | Lifecycle chain ID computation | 13 |
PROFILE: | Profile signing messages | 10.3 |
SWT3:LEAF: | Merkle tree leaf hashing | N/A (separate specification) |
SWT3:NODE: | Merkle tree node hashing | N/A (separate specification) |
The UCT Registry is maintained as a public JSON document (uct-registry.json) in the
reference implementation repository. Changes to the registry follow these rules:
Provider codes (Section 6.1) are not centrally registered. Implementations MAY use any uppercase
alphanumeric string as a provider code. The following codes are in common use: VULTR,
AWS, AZURE, GCP, HYBRID, ON-PREM.
This section describes the considerations that motivate adoption of an open, standardized witness protocol rather than proprietary alternatives.
Assessor portability. When multiple assessment bodies (Notified Bodies, C3PAOs, auditors) understand a common evidence format, conformity assessments are faster and less expensive. A proprietary evidence format requires each assessment body to learn and maintain custom verification tooling per provider.
Deployer interoperability. A deployer building applications on models from multiple providers needs one compliance system, not N proprietary formats. SWT3 is provider-neutral and distribution-model-neutral. A single SDK integration produces evidence that is valid across all provider relationships.
Verification independence. Any party can recompute a fingerprint using standard SHA-256 with no proprietary SDK, API access, or platform account. Verification requires only the input components and a conforming SHA-256 implementation, both of which are universally available.
Cross-provider network effects. Each new provider that adopts SWT3 reduces compliance cost for every deployer already using it, and each new deployer reduces the marginal cost of the next provider's adoption. This creates a positive-sum dynamic where early adoption yields compounding returns.
Governance participation. Organizations implementing and deploying SWT3 are positioned to participate in the governance of the protocol as it matures. Early adopters of open protocols shape the standards that follow.
Historical precedent supports this pattern. TLS (formerly SSL) began as a single-vendor protocol and became the universal transport security layer. SWIFT began as a cooperative of 239 banks and became the global financial messaging standard. XBRL began at a single accounting body and became the international standard for regulatory financial reporting. In each case, the protocol's value derived from its neutrality and universal adoption, not from any single vendor's implementation.
Conforming reference implementations are available in seven programming languages. All implementations achieve 100% parity on the test vectors in Section 18.
| Language | Package | Registry |
|---|---|---|
| Python | swt3-ai | PyPI |
| TypeScript | @tenova/swt3-ai | npm |
| Rust | swt3-ai | crates.io |
| C# | swt3-ai | NuGet |
| Ruby | swt3-ai | RubyGems |
| Swift | swt3-ai | Swift Package Index |
| Kotlin | swt3-ai | Maven Central |
A Model Context Protocol (MCP) server implementation is also available:
| Type | Package | Registry |
|---|---|---|
| MCP Server | @tenova/swt3-mcp | npm |
The following documents are referenced informatively in this specification:
| Reference | Title |
|---|---|
| Regulation (EU) 2024/1689 | Artificial Intelligence Act (European Parliament and Council, 2024) |
| NIST AI 100-1 | Artificial Intelligence Risk Management Framework (NIST, 2023) |
| ISO/IEC 42001:2023 | Artificial intelligence management system (ISO/IEC, 2023) |
| ISO/IEC 23894:2023 | Guidance on AI risk management (ISO/IEC, 2023) |
| W3C Verifiable Credentials Data Model v2.0 | (W3C, 2024) |
| NIST SP 800-53 Rev. 5 | Security and Privacy Controls for Information Systems and Organizations (NIST, 2020) |
| CMMC Model 2.0 | Cybersecurity Maturity Model Certification (DoD, 2021) |