vCon Expert - Complete Conversational Data Container Specialist
⚠️ CRITICAL: How to Access Documentation
This skill includes IETF specification documents in its vcon-documentation/ subdirectory.
When performing any vCon operations, Claude MUST:
- •✅ Read docs from
./vcon-documentation/(relative path within the skill) - •✅ Use
Filesystem:read_filetool with skill-relative paths - •❌ NEVER read from
/mnt/project/or user's local filesystem - •❌ NEVER use absolute paths like
/home/,/Users/, etc.
Correct Example:
Filesystem:read_file("./vcon-documentation/draft-ietf-vcon-vcon-core-01")
Files bundled in this skill:
- •
./vcon-documentation/draft-ietf-vcon-vcon-core-01- Core spec (v0.4.0) - •
./vcon-documentation/draft-ietf-vcon-cc-extension-01- Contact Center extension - •
./vcon-documentation/draft-ietf-vcon-privacy-primer-00- Privacy considerations - •
./vcon-documentation/draft-howe-vcon-wtf-extension-01- World Transcription Format extension - •
./vcon-documentation/draft-miller-vcon-zip-bundle-00- ZIP Bundle packaging format - •
./vcon-documentation/_draft-ietf-vcon-mimi-messages-00- MIMI messaging extension - •
./vcon-documentation/_draft-ietf-vcon-overview-00- Overview and use cases
Overview
This skill provides comprehensive expertise on vCon (Virtualized Conversations), the IETF standard for exchanging conversational data. It combines validation capabilities with deep knowledge to answer questions, provide guidance, and generate production-ready code in multiple languages.
Primary Capabilities:
- •Validation & Compliance - Validate vCon files against IETF standards
- •Expert Q&A - Answer detailed questions about vCon structure, use cases, and best practices
- •Multi-Language Code Generation - Generate Go, JavaScript, and Python implementations
- •Architecture Guidance - Provide system design advice for vCon integration
- •Extension Support - Explain and implement vCon extensions (CC, MIMI, WTF, etc.)
When to Use This Skill:
- •Any question about vCons, their structure, or usage
- •Validating vCon JSON files for compliance
- •Generating code to work with vCons in Go, JavaScript, or Python
- •Understanding vCon extensions and their applications
- •Designing systems that integrate conversational data
- •Privacy and security considerations for conversation handling
- •Contact center, messaging, or emergency communication use cases
Latest vCon Specification (v0.4.0)
Current Version Status
- •Active Draft: draft-ietf-vcon-vcon-core-01 (October 2025)
- •Version: 0.4.0 (moving toward v1.0)
- •Working Group: IETF Virtualized Conversations (vcon)
- •Status: Internet-Draft (Standards Track)
Key Updates from Latest IETF Documents
Version Field Change:
- •The
vconfield MUST have value"0.4.0" - •Working toward semantic versioning in future releases
New Parameters:
- •
must_support: "String[]" - Lists incompatible extensions that MUST be supported - •
did: Decentralized Identifier support added to Party Object - •
product: New Analysis Object parameter to identify vendor products - •
timezone: New Party Object parameter for party location timezone
Extension Framework Enhancements:
- •Compatible vs. Incompatible extension classification
- •Extensions listed in
must_supportMUST be supported to correctly interpret the vCon - •New IANA registries for vCon parameters and extensions
- •Standardized extension naming conventions
Media Type Registration:
- •
application/vcon+json- Standard JSON vCon - •
application/vcon+gzip- Compressed vCon format - •
application/vcon+zip- vCon ZIP Bundle (.vconz) format
Core vCon Architecture
Three Forms of vCon
vCons exist in three distinct security forms:
- •
Unsigned Form - Mutable, in-progress vCon for data collection
- •Contains:
parties,dialog,analysis,attachmentsarrays - •Use: During conversation capture and before export
- •Contains:
- •
Signed Form (JWS) - Immutable, integrity-protected vCon
- •Contains:
payload(base64url encoded unsigned vCon) andsignatures - •Use: When crossing security domains or for audit trails
- •Contains:
- •
Encrypted Form (JWE) - Confidential, privacy-protected vCon
- •Contains:
ciphertext(encrypted signed vCon) andrecipients - •Use: When containing PII or sensitive conversation data
- •Contains:
Required Top-Level Fields
{
"vcon": "0.4.0",
"uuid": "018c8a7e-5f3d-8000-9a2b-3c4d5e6f7a8b",
"created_at": "2025-10-20T14:30:00.000Z",
"parties": [...]
}
Optional Top-Level Fields
{
"extensions": ["CC", "MIMI"],
"must_support": ["CUSTOM-EXTENSION"],
"updated_at": "2025-10-20T15:45:00.000Z",
"subject": "Customer support call regarding order #12345",
"dialog": [...],
"analysis": [...],
"attachments": [...],
"redacted": {...},
"appended": {...},
"group": [...]
}
vCon Object Model
Party Object
Represents participants in the conversation:
{
"tel": "+1-555-0100",
"sip": "user@example.com",
"mailto": "user@example.com",
"name": "Alice Smith",
"did": "did:example:123456789abcdefghi",
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"validation": "SSN-last-4",
"jcard": {...},
"gmlpos": "40.7128 -74.0060",
"civicaddress": {
"country": "US",
"a1": "NY",
"a3": "New York",
"pc": "10001"
},
"timezone": "America/New_York"
}
Dialog Object
Contains conversation media (text, audio, video):
{
"type": "recording",
"start": "2025-10-20T14:30:00.000Z",
"duration": 180.5,
"parties": [0, 1],
"originator": 0,
"mediatype": "audio/x-wav",
"filename": "call-recording.wav",
"encoding": "base64url",
"body": "UklGRn4...",
"disposition": "resolved",
"session_id": "a84b23a9cdef...",
"application": "Zoom",
"message_id": "msg_123456"
}
Dialog Types:
- •
recording- Audio/video recording - •
text- Text message or chat - •
transfer- Call transfer metadata (no media) - •
incomplete- Failed connection attempt
Analysis Object
Post-conversation analysis results:
{
"type": "transcript",
"dialog": [0],
"mediatype": "application/json",
"vendor": "OpenAI",
"product": "Whisper",
"schema": "v3",
"encoding": "json",
"body": "{\"segments\": [...]}"
}
Analysis Types:
- •
summary- Conversation summary - •
transcript- Speech-to-text transcription - •
translation- Language translation - •
sentiment- Sentiment analysis - •
tts- Text-to-speech generation
Attachment Object
Related documents and files:
{
"type": "contract",
"start": "2025-10-20T14:35:00.000Z",
"party": 0,
"dialog": 0,
"mediatype": "application/pdf",
"filename": "contract-v2.pdf",
"url": "https://example.com/files/contract-v2.pdf",
"content_hash": "SHA-512:z4PhNX7vuL..."
}
vCon ZIP Bundle Format (.vconz)
Overview
The vCon ZIP Bundle (.vconz) format provides a standardized way to package one or more vCons with their associated media files into a single, self-contained archive. This addresses the challenge of external file dependencies while enabling offline processing and simplified distribution.
Key Features:
- •Self-containment: All referenced files included in the archive
- •Multi-vCon support: Bundle multiple related vCons with automatic deduplication
- •Integrity preservation: Original content hashes maintained for verification
- •Platform independence: Standard ZIP format supported everywhere
- •Simplicity: Flat structure with hash-based file naming
- •Offline processing: No network dependencies after bundle creation
Bundle Structure
bundle.vconz
├── manifest.json # Bundle format identifiers
├── files/ # All media files (flat, deduplicated)
│ ├── sha512-GLy6IPa...UQ.wav # Hash-named with extensions
│ ├── sha512-Def456...XYZ.pdf
│ └── sha512-Transcript...ABC.json
├── vcons/ # All vCon JSON files
│ ├── 0195544a-b9b1-8ee4-b9a2-279e0d16bc46.json
│ └── 01955450-1234-5678-9abc-def012345678.json
└── extensions/ # Future vCon extensions (optional)
└── [extension-name]/
├── metadata.json
└── files/
└── sha256-ExtData...GHI.cbor
Core Components
manifest.json
Minimal bundle metadata:
{
"format": "vcon-bundle",
"version": "1.0"
}
vCon Files
- •Stored as
vcons/[uuid].json - •Complete, original vCon in any security form (unsigned, signed JWS, encrypted JWE)
- •All external URL references and content_hash values preserved exactly as received
Media Files
- •Stored in flat
files/directory - •Named using pattern:
[hash-algorithm]-[base64url-hash].[extension] - •Example:
sha512-GLy6IPaIUM1GqzZqfIPZlWjaDsNgNvZM...UQ.wav - •Automatic deduplication: identical content (same hash) stored only once
File Naming Conventions
Hash-Based Filenames:
- •Format:
[algorithm]-[hash].[extension] - •SHA-512 MUST be supported (primary algorithm)
- •Additional algorithms MAY be supported
- •Extensions determined by:
- •MIME type from vCon mediatype field (preferred)
- •Content analysis (magic bytes)
- •Original URL extension
- •Generic
.binif undetermined
Multi-Hash Support: When a vCon has multiple content hashes:
- •Use first hash for filename generation
- •Prefer SHA-512 if present in array
- •Verify ALL hashes during creation and extraction
Bundle Creation Process
For Unsigned vCons:
- •Parse JSON to identify external references
- •Download files from HTTPS URLs
- •Verify content hashes (ALL algorithms)
- •Store in files/ directory with hash-based names
- •Preserve original vCon JSON
For Signed vCons (JWS):
- •Preserve complete JWS structure
- •Decode payload to identify external references
- •Resolve and bundle external files
- •Save original JWS structure (not payload)
For Encrypted vCons (JWE):
- •Preserve complete JWE structure
- •If decryption keys available: decrypt, resolve files, re-encrypt
- •If keys unavailable: include encrypted vCon without resolving files
- •Save original JWE structure
Multi-vCon Bundling:
- •Collect all vCons to include
- •Resolve files for each vCon
- •Automatic deduplication by content_hash
- •Store each vCon as vcons/[uuid].json
- •Include referenced vCons (via Group objects) when available
Bundle Extraction and Usage
Extraction Process:
- •Extract ZIP to directory
- •Validate bundle structure (manifest.json, vcons/, files/)
- •Verify bundle format and version
- •Discover vCons by scanning vcons/ directory
- •For each vCon:
- •Parse according to security form
- •Identify file references via content_hash
- •Verify files exist in files/
- •Verify file integrity using content_hash
File Resolution:
// To resolve a file from a vCon:
const contentHash = "sha512-GLy6IPa...UQ";
const mediatype = "audio/wav";
const extension = getExtension(mediatype); // .wav
const filePath = `files/${contentHash}.${extension}`;
vCon References and Relationships
Group Objects: vCons may reference other vCons through Group Objects. When bundling:
- •Referenced vCons SHOULD be included as separate files
- •Group Object's uuid field enables discovery
- •Bundle readers check for content_hash in files/ before external resolution
Reference Discovery:
- •Scan vcons/ directory for all *.json files
- •For each vCon, check group[] array for uuid fields
- •Verify referenced vCons present in bundle
- •Build relationship graph
Security Considerations
Content Verification:
- •All files MUST be verified against ALL content_hash values
- •Bundle creators MUST validate HTTPS certificates
- •SHA-512 MUST be supported
- •Hash verification failure MUST fail bundle creation
Security Form Preservation:
- •Signed vCons: Preserve complete JWS, verify signatures
- •Encrypted vCons: Preserve complete JWE, never downgrade
- •Bundle creators MUST NOT modify vCon content or remove signatures
Privacy Protection:
- •Preserve privacy controls from original vCons
- •Maintain redaction integrity
- •Handle party identification per privacy regulations
- •ZIP-level encryption MAY be used but doesn't replace vCon-level security
File Deduplication Security:
- •Same hash = identical content (cryptographic guarantee)
- •No information leakage from file reuse
- •Each vCon's content_hash independently verifiable
Bundle Validation
Bundle creators MUST validate:
- •Hash verification (all content hashes match)
- •File completeness (all external references resolved)
- •Security form integrity (signatures/encryption intact)
- •UUID uniqueness (no duplicate vCon UUIDs)
- •File accessibility (all files referenced by at least one vCon)
- •Manifest validity (valid JSON with required fields)
Extension Support
The extensions/ directory supports future vCon extensions:
extensions/
└── [extension-name]/
├── metadata.json # Extension metadata and schema
└── files/ # Extension-specific files
└── [hash-names] # Following same naming conventions
Extension Metadata:
{
"extension_name": "mimi-messages",
"extension_version": "1.0",
"vcon_version_compatibility": ["0.4.0"],
"bundle_format_version": "1.0",
"description": "MIMI protocol message support for vCon"
}
Bundle Examples
Single vCon Bundle
simple-call.vconz
├── manifest.json
├── files/
│ ├── sha512-GLy6IPa...UQ.wav
│ └── sha512-Transcript...XYZ.json
└── vcons/
└── 0195544a-b9b1-8ee4-b9a2-279e0d16bc46.json
Multi-vCon Bundle with Deduplication
support-case.vconz
├── manifest.json
├── files/
│ ├── sha512-Call1Audio...ABC.wav
│ ├── sha512-Call2Audio...DEF.wav
│ ├── sha512-SharedDoc...GHI.pdf # Referenced by both vCons!
│ ├── sha512-Transcript1...JKL.json
│ └── sha512-Transcript2...MNO.json
└── vcons/
├── 0195544a-b9b1-8ee4-b9a2-279e0d16bc46.json
└── 0195544b-c2d3-4e5f-6a7b-8c9d0e1f2a3b.json
Redacted vCon Bundle
redacted-call.vconz
├── manifest.json
├── files/
│ ├── sha512-RedactedAudio...ABC.wav
│ ├── sha512-OriginalAudio...DEF.wav
│ └── sha512-RedactedTranscript...GHI.json
└── vcons/
├── 01955460-aaaa-bbbb-cccc-ddddeeeeeeee.json # Original
└── 01955461-ffff-gggg-hhhh-iiiijjjjkkkk.json # Redacted
Implementation Requirements
MUST Support:
- •Multi-vCon bundling with automatic deduplication
- •All vCon content arrays (parties, dialog, analysis, attachments)
- •All three security forms (unsigned, signed JWS, encrypted JWE)
- •SHA-512 content hash verification
- •Hash-based file naming with extension determination
- •Standard ZIP format with specified structure
- •vCon discovery via vcons/ directory scanning
- •File lookup via content_hash values
- •Group object reference handling
SHOULD Support:
- •JWS signature verification
- •JWE decryption (with appropriate keys)
- •Additional hash algorithms (SHA-256)
- •Bundle validation and integrity checking
- •Extension directory support
- •Efficient large file handling (streaming)
MAY Support:
- •Compression optimization
- •Incremental bundle updates
- •Bundle format migration tools
- •Custom extension handling
- •ZIP-level encryption
- •Bundle analysis tools
Error Handling
Bundle Creation Errors:
- •Network failures: Retry with backoff, fail after max attempts
- •Hash mismatches: MUST fail with expected vs actual
- •Missing files: MUST fail unless configured to skip
- •Access denied: MUST fail, do not retry
- •Invalid JWS: SHOULD warn, MAY continue
- •JWE decryption failure: MUST fail
- •Missing keys: MUST fail with clear error
Bundle Extraction Errors:
- •Corrupted ZIP: MUST fail
- •Missing manifest.json: MUST fail
- •Missing vcons/ directory: MUST fail
- •Hash verification failure: MUST fail unless configured for warnings
- •JWS signature failure: SHOULD warn, MAY continue
- •Missing files: MUST fail if referenced in vCon
- •Orphaned files: MAY warn if not referenced
Best Practices
Bundle Creation:
- •Always validate content hashes before including files
- •Use HTTPS exclusively for external URLs
- •Preserve original vCon security forms
- •Include related vCons from Group references
- •Document bundle purpose in accompanying metadata
Bundle Distribution:
- •Consider ZIP-level encryption for sensitive bundles
- •Verify bundle integrity before distribution
- •Provide bundle validation tools to recipients
- •Document required decryption keys separately
- •Use secure channels for bundle transmission
Bundle Storage:
- •Store bundles with descriptive names (e.g.,
case-12345-2025-01-15.vconz) - •Index bundles by vCon UUIDs for fast lookup
- •Maintain bundle metadata (creation date, source, purpose)
- •Implement retention policies
- •Regular integrity verification
Multi-Language Code Generation
This skill generates production-ready code in three languages:
Language Selection Guidance
Go - Best for:
- •High-performance vCon processing
- •Microservices and cloud-native applications
- •System integrations with strong typing
- •Validation and compliance tools
JavaScript/TypeScript - Best for:
- •Web applications and APIs
- •Real-time conversation capture
- •Browser-based vCon tools
- •Node.js backend services
Python - Best for:
- •Data analysis and ML pipelines
- •Rapid prototyping
- •Scientific computing on conversation data
- •Integration with AI/ML frameworks
Code Generation Standards
All generated code MUST:
- •Include comprehensive type definitions/interfaces
- •Provide validation functions
- •Handle all three vCon forms (unsigned, signed, encrypted)
- •Include error handling and edge cases
- •Add inline documentation
- •Use language-specific best practices
- •Be production-ready without modifications
vCon Extensions
Contact Center (CC) Extension
Adds contact center-specific fields to Party and Dialog objects:
Party Object Extensions:
{
"contact_list": "premium_customers",
"skill": "technical_support",
"queue_time": 45,
"ring_time": 8,
"disposition": "resolved",
"dnis": "+1-800-555-0100",
"ani": "+1-555-0123",
"customer_id": "CUST-98765"
}
MIMI (More Instant Messaging Interoperability) Extension
Supports modern messaging platforms:
Dialog Object Extensions:
- •Group conversation support
- •Message threading
- •Reactions and read receipts
- •Rich media attachments
- •Platform-specific metadata
WTF (World Transcription Format) Extension
Standardized transcription analysis framework (draft-howe-vcon-wtf-extension-01):
Extension Classification: Compatible Extension - can be safely ignored by implementations that don't support transcription analysis
Extension Token: wtf_transcription
Purpose: Provides a unified analysis framework for speech-to-text transcription data from multiple providers with consistent structure, quality metrics, and confidence scoring.
Supported Providers:
- •Whisper™ (OpenAI)
- •Deepgram™
- •AssemblyAI™
- •Google Cloud Speech-to-Text™
- •Amazon Transcribe™
- •Azure Speech Services™
- •Rev.ai™
- •Speechmatics™
- •Wav2Vec2™
- •Parakeet™ (NVIDIA)
Analysis Object Structure:
{
"type": "wtf_transcription",
"start": "2025-01-02T12:16:35Z",
"dialog": 0,
"encoding": "json",
"body": {
"transcript": {
"text": "Complete transcription text",
"language": "en-US",
"duration": 65.2,
"confidence": 0.92
},
"segments": [
{
"id": 0,
"start": 0.5,
"end": 4.8,
"text": "Hello, this is Alice from customer service.",
"confidence": 0.95,
"speaker": 0,
"words": [0, 1, 2, 3, 4, 5, 6]
}
],
"metadata": {
"created_at": "2025-01-02T12:15:30Z",
"processed_at": "2025-01-02T12:16:35Z",
"provider": "deepgram",
"model": "nova-2",
"processing_time": 12.5,
"audio": {
"duration": 65.2,
"sample_rate": 8000,
"channels": 1,
"format": "wav",
"bitrate": 128
},
"options": {
"punctuate": true,
"diarize": true,
"language": "en"
}
},
"words": [
{
"id": 0,
"start": 0.5,
"end": 0.8,
"text": "Hello",
"confidence": 0.98,
"speaker": 0,
"is_punctuation": false
}
],
"speakers": {
"0": {
"id": 0,
"label": "Alice (Customer Service)",
"segments": [0],
"total_time": 4.3,
"confidence": 0.95
}
},
"quality": {
"audio_quality": "high",
"background_noise": 0.1,
"multiple_speakers": true,
"overlapping_speech": false,
"silence_ratio": 0.15,
"average_confidence": 0.92,
"low_confidence_words": 0,
"processing_warnings": []
},
"extensions": {
"provider_name": {
// Provider-specific fields
}
}
}
}
WTF Schema Sections:
Required Fields:
- •
transcript: Complete transcript with text, language (BCP-47), duration, and overall confidence - •
segments: Time-aligned text chunks with start/end times, text, confidence, and optional speaker ID - •
metadata: Processing information including timestamps, provider, model, audio details, and options
Optional Fields:
- •
words: Word-level details with timing and confidence - •
speakers: Speaker diarization with labels, segments, and speaking time - •
quality: Audio quality assessment and processing metrics - •
alternatives: Alternative transcription hypotheses - •
enrichments: Additional analysis features - •
extensions: Provider-specific data preservation - •
streaming: Real-time streaming information
Key Features:
- •Hierarchical Structure: Words → Segments → Complete Transcript
- •Confidence Normalization: All scores normalized to [0.0-1.0] range
- •Multi-Provider Support: Consistent format across different transcription services
- •Quality Metrics: Built-in audio quality and confidence assessments
- •Speaker Diarization: "Who spoke when" analysis support
- •Extensibility: Provider-specific features preserved in extensions field
Q&A Expertise
This skill can answer questions about:
Technical Questions
- •vCon structure and schema details
- •Validation requirements and compliance
- •Extension mechanisms and compatibility
- •Security considerations (signing, encryption)
- •Media type handling
- •UUID generation strategies
- •Redaction and appending workflows
Use Case Questions
- •Contact center integration
- •Messaging platform data exchange
- •Emergency services (ECRIT) applications
- •Healthcare conversation management
- •Legal and compliance requirements
- •Multi-channel conversation aggregation
Implementation Questions
- •Best practices for vCon creation
- •Performance optimization strategies
- •Storage and retrieval patterns
- •Real-time vs. batch processing
- •API design considerations
- •Testing and validation strategies
Validation Capabilities
Validation Process
- •
Structure Validation
- •Valid JSON syntax
- •Required fields present
- •Correct vCon version
- •
Schema Validation
- •Field types correct
- •Value constraints met
- •Array indices valid
- •
Content Validation
- •UUID format (v8 or v4)
- •RFC 3339 timestamps
- •Tel/SIP/mailto URL formats
- •Content hash integrity
- •
Extension Validation
- •Declared extensions used
- •must_support extensions recognized
- •Extension-specific fields valid
- •
Security Validation
- •HTTPS URLs only
- •SHA-512 content hashes present
- •Signature validation (if signed)
- •Encryption validation (if encrypted)
Validation Report Format
# vCon Validation Report **File**: example-vcon.json **Validation Date**: 2025-10-20T16:00:00Z **vCon Version**: 0.4.0 **vCon Form**: unsigned ## Compliance Status ✅ **COMPLIANT** ## Summary - **Total Issues**: 0 - **Critical Errors**: 0 - **Warnings**: 0 - **Suggestions**: 2 ## Validation Results ### ✅ Structural Validity - [x] Valid JSON structure - [x] Required top-level fields present - [x] Correct vCon version (0.4.0) - [x] UUID format valid (UUID v8) ### ✅ Schema Compliance - [x] All timestamps RFC 3339 compliant - [x] Party indices within bounds - [x] Dialog types valid - [x] Media types properly formatted ### ✅ Extension Compliance - [x] CC Extension properly declared - [x] All CC-specific fields valid ### 💡 Suggestions 1. **Add updated_at timestamp** - Consider adding `updated_at` for audit trail 2. **Include content hashes for external URLs** - External dialog references should include SHA-512 hash
Code Generation Examples
Example 1: Go vCon Parser
User Request: "Generate Go code to parse and validate vCons"
Response Structure:
- •Type definitions for all vCon objects
- •Validation functions with detailed error handling
- •Parser with support for all three forms
- •Utility functions (UUID validation, date parsing, content hash verification)
- •Complete example usage
package vcon
import (
"crypto/sha512"
"encoding/base64"
"encoding/json"
"fmt"
"time"
)
// VCon represents the top-level vCon object
type VCon struct {
VCon string `json:"vcon"`
UUID string `json:"uuid"`
Extensions []string `json:"extensions,omitempty"`
MustSupport []string `json:"must_support,omitempty"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt *time.Time `json:"updated_at,omitempty"`
Subject string `json:"subject,omitempty"`
Parties []Party `json:"parties"`
Dialog []Dialog `json:"dialog,omitempty"`
Analysis []Analysis `json:"analysis,omitempty"`
Attachments []Attachment `json:"attachments,omitempty"`
Redacted *Redacted `json:"redacted,omitempty"`
Appended *Appended `json:"appended,omitempty"`
Group []Group `json:"group,omitempty"`
}
// Party represents a participant in the conversation
type Party struct {
Tel string `json:"tel,omitempty"`
SIP string `json:"sip,omitempty"`
Mailto string `json:"mailto,omitempty"`
Name string `json:"name,omitempty"`
DID string `json:"did,omitempty"`
UUID string `json:"uuid,omitempty"`
Validation string `json:"validation,omitempty"`
GMLPos string `json:"gmlpos,omitempty"`
CivicAddress *CivicAddress `json:"civicaddress,omitempty"`
Timezone string `json:"timezone,omitempty"`
}
// Validate checks if the vCon is compliant with the specification
func (v *VCon) Validate() error {
if v.VCon != "0.4.0" {
return fmt.Errorf("invalid vcon version: %s", v.VCon)
}
if err := validateUUID(v.UUID); err != nil {
return fmt.Errorf("invalid uuid: %w", err)
}
if len(v.Parties) == 0 {
return fmt.Errorf("at least one party is required")
}
// Validate all parties
for i, party := range v.Parties {
if err := party.Validate(); err != nil {
return fmt.Errorf("invalid party at index %d: %w", i, err)
}
}
// Validate dialog references
for i, dialog := range v.Dialog {
if err := dialog.ValidatePartyRefs(len(v.Parties)); err != nil {
return fmt.Errorf("invalid dialog at index %d: %w", i, err)
}
}
return nil
}
func validateUUID(uuid string) error {
// UUID validation logic
if len(uuid) != 36 {
return fmt.Errorf("invalid uuid length")
}
return nil
}
Example 2: JavaScript vCon Builder
User Request: "Create JavaScript code to build vCons programmatically"
Response Structure:
- •TypeScript interfaces for type safety
- •Builder class with fluent API
- •Validation methods
- •Serialization/deserialization
- •Example usage with real-world scenario
/**
* vCon Builder - TypeScript/JavaScript
* Provides a fluent API for constructing vCon objects
*/
interface VCon {
vcon: string;
uuid: string;
created_at: string;
updated_at?: string;
parties: Party[];
dialog?: Dialog[];
analysis?: Analysis[];
extensions?: string[];
must_support?: string[];
}
interface Party {
tel?: string;
name?: string;
mailto?: string;
uuid?: string;
}
interface Dialog {
type: 'recording' | 'text' | 'transfer' | 'incomplete';
start: string;
duration?: number;
parties: number | number[];
mediatype?: string;
body?: string;
encoding?: string;
url?: string;
content_hash?: string | string[];
}
class VConBuilder {
private vcon: Partial<VCon>;
constructor() {
this.vcon = {
vcon: '0.4.0',
uuid: this.generateUUID(),
created_at: new Date().toISOString(),
parties: []
};
}
addParty(party: Party): this {
this.vcon.parties!.push(party);
return this;
}
addDialog(dialog: Dialog): this {
if (!this.vcon.dialog) {
this.vcon.dialog = [];
}
this.vcon.dialog.push(dialog);
return this;
}
setSubject(subject: string): this {
this.vcon.subject = subject;
return this;
}
addExtension(extension: string): this {
if (!this.vcon.extensions) {
this.vcon.extensions = [];
}
this.vcon.extensions.push(extension);
return this;
}
build(): VCon {
this.validate();
return this.vcon as VCon;
}
private validate(): void {
if (!this.vcon.parties || this.vcon.parties.length === 0) {
throw new Error('At least one party is required');
}
// Validate party indices in dialogs
if (this.vcon.dialog) {
const maxPartyIndex = this.vcon.parties!.length - 1;
for (const dialog of this.vcon.dialog) {
const parties = Array.isArray(dialog.parties)
? dialog.parties
: [dialog.parties];
for (const partyIdx of parties) {
if (partyIdx > maxPartyIndex) {
throw new Error(
`Dialog references invalid party index: ${partyIdx}`
);
}
}
}
}
}
private generateUUID(): string {
// UUID v8 generation (simplified)
return 'xxxxxxxx-xxxx-8xxx-yxxx-xxxxxxxxxxxx'.replace(
/[xy]/g,
(c) => {
const r = (Math.random() * 16) | 0;
const v = c === 'x' ? r : (r & 0x3) | 0x8;
return v.toString(16);
}
);
}
toJSON(): string {
return JSON.stringify(this.build(), null, 2);
}
}
// Example usage
const vcon = new VConBuilder()
.setSubject('Customer support call')
.addParty({
tel: '+1-555-0100',
name: 'Alice Smith'
})
.addParty({
tel: '+1-555-0200',
name: 'Support Agent'
})
.addDialog({
type: 'recording',
start: new Date().toISOString(),
duration: 180.5,
parties: [0, 1],
mediatype: 'audio/x-wav',
url: 'https://example.com/recordings/call123.wav',
content_hash: 'SHA-512:abc123...'
})
.build();
console.log(JSON.stringify(vcon, null, 2));
Example 3: Python vCon Analyzer
User Request: "Generate Python code for vCon analysis and data extraction"
Response Structure:
- •Pydantic models for validation
- •Parser and loader functions
- •Analysis extractors
- •Statistical aggregation
- •Export utilities
"""
vCon Analyzer - Python
Provides tools for parsing, analyzing, and extracting data from vCons
"""
from datetime import datetime
from typing import List, Optional, Dict, Any, Union
from pydantic import BaseModel, Field, validator
import json
import hashlib
import base64
class Party(BaseModel):
tel: Optional[str] = None
sip: Optional[str] = None
mailto: Optional[str] = None
name: Optional[str] = None
did: Optional[str] = None
uuid: Optional[str] = None
validation: Optional[str] = None
class Dialog(BaseModel):
type: str
start: datetime
duration: Optional[float] = None
parties: Union[int, List[int]]
originator: Optional[int] = None
mediatype: Optional[str] = None
filename: Optional[str] = None
body: Optional[str] = None
encoding: Optional[str] = None
url: Optional[str] = None
content_hash: Optional[Union[str, List[str]]] = None
@validator('type')
def validate_type(cls, v):
valid_types = ['recording', 'text', 'transfer', 'incomplete']
if v not in valid_types:
raise ValueError(f'Invalid dialog type: {v}')
return v
class Analysis(BaseModel):
type: str
dialog: Optional[Union[int, List[int]]] = None
mediatype: Optional[str] = None
vendor: Optional[str] = None
product: Optional[str] = None
schema: Optional[str] = None
body: Optional[str] = None
encoding: Optional[str] = None
url: Optional[str] = None
class VCon(BaseModel):
vcon: str
uuid: str
created_at: datetime
updated_at: Optional[datetime] = None
subject: Optional[str] = None
parties: List[Party]
dialog: Optional[List[Dialog]] = None
analysis: Optional[List[Analysis]] = None
extensions: Optional[List[str]] = None
must_support: Optional[List[str]] = None
@validator('vcon')
def validate_version(cls, v):
if v != '0.4.0':
raise ValueError(f'Unsupported vCon version: {v}')
return v
@validator('parties')
def validate_parties(cls, v):
if len(v) == 0:
raise ValueError('At least one party is required')
return v
class VConAnalyzer:
"""Analyzer for extracting insights from vCons"""
def __init__(self, vcon: VCon):
self.vcon = vcon
def get_conversation_duration(self) -> float:
"""Calculate total conversation duration in seconds"""
if not self.vcon.dialog:
return 0.0
total = sum(
d.duration for d in self.vcon.dialog
if d.duration is not None and d.type == 'recording'
)
return total
def get_participants(self) -> List[Dict[str, str]]:
"""Extract participant information"""
participants = []
for i, party in enumerate(self.vcon.parties):
info = {
'index': i,
'name': party.name or 'Unknown',
'tel': party.tel,
'email': party.mailto
}
participants.append(info)
return participants
def get_transcripts(self) -> List[str]:
"""Extract all transcript analysis"""
if not self.vcon.analysis:
return []
transcripts = []
for analysis in self.vcon.analysis:
if analysis.type == 'transcript' and analysis.body:
# Decode if needed
if analysis.encoding == 'base64url':
decoded = base64.urlsafe_b64decode(analysis.body)
transcripts.append(decoded.decode('utf-8'))
elif analysis.encoding in ['json', 'none', None]:
transcripts.append(analysis.body)
return transcripts
def get_summary_stats(self) -> Dict[str, Any]:
"""Generate summary statistics"""
return {
'uuid': self.vcon.uuid,
'created_at': self.vcon.created_at.isoformat(),
'subject': self.vcon.subject,
'num_parties': len(self.vcon.parties),
'num_dialogs': len(self.vcon.dialog) if self.vcon.dialog else 0,
'num_analysis': len(self.vcon.analysis) if self.vcon.analysis else 0,
'total_duration': self.get_conversation_duration(),
'extensions_used': self.vcon.extensions or [],
'has_recordings': any(
d.type == 'recording'
for d in (self.vcon.dialog or [])
),
'has_transcripts': any(
a.type == 'transcript'
for a in (self.vcon.analysis or [])
)
}
def export_to_dict(self) -> dict:
"""Export vCon to dictionary"""
return self.vcon.dict(exclude_none=True)
def export_to_json(self, indent: int = 2) -> str:
"""Export vCon to JSON string"""
return json.dumps(self.export_to_dict(), indent=indent, default=str)
# Example usage
def load_vcon(filepath: str) -> VCon:
"""Load vCon from JSON file"""
with open(filepath, 'r') as f:
data = json.load(f)
return VCon(**data)
def analyze_vcon(filepath: str):
"""Analyze a vCon file and print statistics"""
vcon = load_vcon(filepath)
analyzer = VConAnalyzer(vcon)
stats = analyzer.get_summary_stats()
print("vCon Analysis Report")
print("=" * 50)
print(f"UUID: {stats['uuid']}")
print(f"Subject: {stats['subject']}")
print(f"Participants: {stats['num_parties']}")
print(f"Dialog segments: {stats['num_dialogs']}")
print(f"Analysis objects: {stats['num_analysis']}")
print(f"Total duration: {stats['total_duration']:.1f}s")
print(f"Extensions: {', '.join(stats['extensions_used']) or 'None'}")
print()
participants = analyzer.get_participants()
print("Participants:")
for p in participants:
print(f" [{p['index']}] {p['name']}")
if p['tel']:
print(f" Tel: {p['tel']}")
if p['email']:
print(f" Email: {p['email']}")
# Run analysis
if __name__ == '__main__':
analyze_vcon('example-vcon.json')
Best Practices
vCon Creation
- •Always use version 0.4.0 in the
vconfield - •Generate UUID v8 for global uniqueness
- •Use RFC 3339 timestamps with timezone information
- •Declare extensions before using extension-specific fields
- •Index parties correctly (0-based array indices)
Security
- •Sign vCons before encryption (JWS → JWE)
- •Use HTTPS for external URLs (never HTTP)
- •Generate SHA-512 hashes for external files
- •Include x5c certificate chain in signed vCons
- •Redact PII before sharing across domains
Performance
- •Use external references for large media files
- •Compress with gzip for transmission
- •Batch process analysis operations
- •Cache parsed vCons in memory
- •Index by UUID for fast lookups
Privacy
- •Create redacted versions for limited access
- •Reference encrypted originals from redacted vCons
- •Minimize data collection from start
- •Track consent in attachments
- •Use validated field for identity verification
Use Case Scenarios
Contact Center Integration
Scenario: Integrate call recordings with customer support system
Solution:
- •Capture call metadata in vCon during conversation
- •Add recording as Dialog Object with external URL
- •Generate transcript using Analysis Object
- •Add customer details in CC extension fields
- •Sign vCon before exporting to CRM
- •Create redacted version for analytics team
Multi-Channel Conversation
Scenario: Track customer journey across chat, email, and phone
Solution:
- •Create separate vCon for each channel/interaction
- •Use Group Object to link related vCons
- •Maintain consistent party UUIDs across vCons
- •Add application field to identify each platform
- •Aggregate analysis across all channels
Emergency Services (ECRIT)
Scenario: Document 911 emergency call with location
Solution:
- •Capture caller location in gmlpos/civicaddress
- •Record audio with timestamp synchronization
- •Include dispatcher notes as analysis
- •Attach incident reports
- •Sign for legal admissibility
- •Encrypt for privacy protection
Compliance and Audit
Scenario: Financial services call recording for compliance
Solution:
- •Create original vCon with full conversation
- •Add compliance tags in subject/analysis
- •Sign vCon with company certificate
- •Create redacted version (remove PII)
- •Store encrypted original for 7 years
- •Provide signed redacted version for audits
Troubleshooting Guide
Common Validation Errors
"Invalid vCon version"
- •Fix: Ensure
"vcon": "0.4.0" - •Check for typos or wrong version number
"Party index out of bounds"
- •Fix: Count parties array (0-indexed)
- •Verify dialog/attachment/analysis party references
- •Add missing parties to parties array
"Invalid RFC 3339 timestamp"
- •Fix: Use format
YYYY-MM-DDTHH:MM:SS.sssZ - •Include timezone (Z or ±HH:MM)
- •Ensure milliseconds have 3 digits
"Unknown vCon form"
- •Issue: Missing identifying fields
- •Unsigned: needs parties/dialog/analysis/attachments
- •Signed: needs payload AND signatures
- •Encrypted: needs ciphertext AND recipients
"Extension not declared"
- •Fix: Add extension name to extensions array
- •Check must_support for incompatible extensions
- •Verify extension-specific fields are valid
Performance Issues
"Slow parsing of large vCons"
- •Use streaming JSON parser
- •Parse only needed sections
- •Consider external references for media
- •Cache parsed vCons in memory
"High memory usage"
- •Don't load all dialog bodies in memory
- •Use external references for recordings
- •Process analysis in batches
- •Implement pagination for large vCon collections
Advanced Topics
Custom Extension Development
Steps to create a vCon extension:
- •
Define the Use Case
- •Identify what additional data is needed
- •Determine which objects need new parameters
- •Classify as Compatible or Incompatible
- •
Design the Schema
- •Use snake_case naming
- •Define parameter types clearly
- •Document semantics thoroughly
- •
Register with IANA
- •Choose unique extension name token
- •Submit registration template
- •Register new parameters
- •
Implement and Test
- •Create reference implementation
- •Validate against core spec
- •Test interoperability
- •
Document
- •Write extension specification
- •Provide code examples
- •Create migration guide if deprecating fields
vCon Signing and Verification
JWS Signing Process:
// Example: Sign a vCon in Go
func SignVCon(vcon *VCon, privateKey *rsa.PrivateKey, certChain []string) (string, error) {
// 1. Serialize unsigned vCon to JSON
payload, err := json.Marshal(vcon)
if err != nil {
return "", err
}
// 2. Optionally compress with gzip
var compressedPayload bytes.Buffer
gzipWriter := gzip.NewWriter(&compressedPayload)
gzipWriter.Write(payload)
gzipWriter.Close()
// 3. Base64url encode
encodedPayload := base64.RawURLEncoding.EncodeToString(compressedPayload.Bytes())
// 4. Create JWS protected header
header := map[string]interface{}{
"alg": "RS256",
"typ": "JWT",
"x5c": certChain, // Certificate chain
}
headerJSON, _ := json.Marshal(header)
encodedHeader := base64.RawURLEncoding.EncodeToString(headerJSON)
// 5. Create signing input
signingInput := encodedHeader + "." + encodedPayload
// 6. Sign with private key
hash := sha256.Sum256([]byte(signingInput))
signature, err := rsa.SignPKCS1v15(rand.Reader, privateKey, crypto.SHA256, hash[:])
if err != nil {
return "", err
}
// 7. Base64url encode signature
encodedSignature := base64.RawURLEncoding.EncodeToString(signature)
// 8. Create JWS compact serialization
jws := encodedHeader + "." + encodedPayload + "." + encodedSignature
// 9. Wrap in signed vCon JSON structure
signedVCon := map[string]interface{}{
"vcon": vcon.VCon,
"uuid": vcon.UUID,
"signatures": []map[string]string{{
"protected": encodedHeader,
"signature": encodedSignature,
}},
"payload": encodedPayload,
}
result, _ := json.Marshal(signedVCon)
return string(result), nil
}
vCon Encryption
JWE Encryption Process:
// Example: Encrypt a signed vCon in JavaScript
async function encryptVCon(signedVCon, publicKey) {
// 1. Serialize signed vCon to JSON
const payload = JSON.stringify(signedVCon);
// 2. Generate content encryption key (CEK)
const cek = crypto.getRandomValues(new Uint8Array(32));
// 3. Encrypt CEK with recipient's public key
const encryptedKey = await crypto.subtle.encrypt(
{
name: 'RSA-OAEP',
hash: 'SHA-256'
},
publicKey,
cek
);
// 4. Generate IV
const iv = crypto.getRandomValues(new Uint8Array(16));
// 5. Encrypt payload with CEK
const encodedPayload = new TextEncoder().encode(payload);
const ciphertext = await crypto.subtle.encrypt(
{
name: 'AES-GCM',
iv: iv,
tagLength: 128
},
await crypto.subtle.importKey(
'raw',
cek,
'AES-GCM',
false,
['encrypt']
),
encodedPayload
);
// 6. Base64url encode components
const encodedEncryptedKey = base64urlEncode(encryptedKey);
const encodedIV = base64urlEncode(iv);
const encodedCiphertext = base64urlEncode(ciphertext);
// 7. Create JWE structure
const jwe = {
vcon: signedVCon.vcon,
uuid: signedVCon.uuid,
recipients: [{
encrypted_key: encodedEncryptedKey
}],
unprotected: {
alg: 'RSA-OAEP',
enc: 'A256GCM'
},
iv: encodedIV,
ciphertext: encodedCiphertext
};
return jwe;
}
Reference Documentation
IETF Specifications
- •
draft-ietf-vcon-vcon-core-00 (July 2025)
- •Core vCon specification
- •JSON schema definition
- •Security considerations
- •
draft-ietf-vcon-cc-extension-01
- •Contact Center extension
- •Call disposition fields
- •Queue metrics
- •
draft-ietf-vcon-privacy-primer-00
- •Privacy considerations
- •Redaction strategies
- •Consent management
- •
draft-ietf-vcon-vcon-overview-00
- •Use cases and scenarios
- •Architecture patterns
- •Integration guidance
- •
draft-miller-vcon-zip-bundle-00 (November 2025)
- •vCon ZIP Bundle (.vconz) packaging format
- •Self-contained archives with media files
- •Multi-vCon support with automatic deduplication
- •Hash-based file naming and integrity verification
- •Supports all vCon security forms (unsigned, signed, encrypted)
- •Offline processing and simplified distribution
- •Media type: application/vcon+zip
- •
draft-howe-vcon-wtf-extension-01
- •World Transcription Format extension
- •Standardized analysis framework for speech-to-text transcription
- •Multi-provider support (Whisper™, Deepgram™, AssemblyAI™, Google, Amazon, Azure, etc.)
- •Compatible Extension - introduces new analysis type "wtf_transcription"
- •Hierarchical structure: words → segments → complete transcripts
- •Quality metrics and confidence scoring normalization [0.0-1.0]
- •Provider-specific features preserved through extensions field
- •Supports speaker diarization and audio quality assessment
Related Standards
- •RFC 3339 - Date and Time on the Internet
- •RFC 4122 - UUID Standard
- •RFC 7515 - JSON Web Signature (JWS)
- •RFC 7516 - JSON Web Encryption (JWE)
- •RFC 8259 - JSON Specification
- •RFC 3986 - URI Syntax
Online Resources
- •IETF vCon Working Group: https://datatracker.ietf.org/wg/vcon/
- •GitHub Repository: https://github.com/ietf-wg-vcon/
- •Mailing List: vcon@ietf.org
Skill Usage Patterns
Pattern 1: Quick Validation
User: "Can you validate this vCon?"
Process:
- •Read the IETF core spec if needed
- •Parse the uploaded vCon JSON
- •Run comprehensive validation
- •Generate detailed report with fixes
- •Provide corrected example if non-compliant
Pattern 2: Code Generation
User: "Generate Python code to parse vCons with validation"
Process:
- •Review language-specific requirements
- •Generate complete type definitions
- •Create parsing and validation functions
- •Add error handling
- •Include usage examples
- •Provide test cases
Pattern 3: Q&A with Deep Dive
User: "How do vCon redactions work and when should I use them?"
Process:
- •Read redaction documentation from spec
- •Explain redaction concept clearly
- •Show object tree diagram
- •Provide use case examples
- •Generate code example in preferred language
- •Discuss privacy considerations
Pattern 4: Extension Guidance
User: "I need to add custom fields for my healthcare application. How do I create a vCon extension?"
Process:
- •Review extension framework documentation
- •Discuss Compatible vs. Incompatible classification
- •Design the extension schema with user
- •Provide IANA registration template
- •Generate reference implementation in 3 languages
- •Create validation code for the extension
Pattern 5: Architecture Consultation
User: "How should I design my system to handle vCons at scale?"
Process:
- •Understand user's specific requirements
- •Discuss vCon lifecycle (creation → signing → storage)
- •Recommend external references for large media
- •Suggest indexing strategies
- •Provide performance optimization tips
- •Show example architecture diagram
- •Generate starter code for their stack
This comprehensive skill makes Claude the foremost expert on vCons, capable of answering any question, validating any vCon, and generating production-ready code in multiple languages. Always read the bundled IETF specifications when needed to provide accurate, up-to-date information.