<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.29 (Ruby 3.2.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-miller-vcon-zip-bundle-00" category="info" submissionType="independent" version="3">
  <!-- xml2rfc v2v3 conversion 3.31.0 -->
  <front>
    <title abbrev="vcon-zip-bundle">vCon Zip Bundle</title>
    <seriesInfo name="Internet-Draft" value="draft-miller-vcon-zip-bundle-00"/>
    <author initials="J." surname="Miller" fullname="Jeremie Miller">
      <organization/>
      <address>
        <email>jeremie.miller@gmail.com</email>
        <uri>https://bsky.app/profile/jeremie.com</uri>
      </address>
    </author>
    <date year="2025" month="November" day="06"/>
    <area>ART</area>
    <workgroup>vCon</workgroup>
    <keyword>vCon</keyword>
    <keyword>zip</keyword>
    <keyword>container</keyword>
    <keyword>bundle</keyword>
    <keyword>packaging</keyword>
    <keyword>conversation</keyword>
    <abstract>
      <?line 36?>

<t>This document defines the vCon Zip Bundle (<tt>.vconz</tt>) file format for packaging one or more vCon conversation data containers with their associated media files into a single, self-contained ZIP archive. While vCons support external file references via HTTPS URLs with content hashes, these dependencies create availability and portability challenges. The vCon Zip Bundle addresses this through a standardized archive format that includes all referenced files, supports multiple vCons with automatic deduplication based on content hashes, preserves data integrity through hash verification, and enables offline processing. This specification maintains full compatibility with all vCon security forms (unsigned, signed, encrypted) as defined in the vCon core specification.</t>
    </abstract>
  </front>
  <middle>
    <?line 40?>

<section anchor="intro">
      <name>Introduction</name>
      <t>vCons support both inline content (base64-encoded in the JSON) and externally referenced files (via HTTPS URLs with content hashes). While external references enable efficient storage and network transfer, they create dependencies on external resources that may become unavailable over time. The vCon Zip Bundle (<tt>.vconz</tt>) format addresses this by:</t>
      <ol spacing="normal" type="1"><li>
          <t><strong>Self-containment</strong>: All referenced files are included within the ZIP archive</t>
        </li>
        <li>
          <t><strong>Multi-vCon support</strong>: Multiple vCons can be bundled together with automatic file deduplication</t>
        </li>
        <li>
          <t><strong>Integrity preservation</strong>: Original content hashes are maintained for verification</t>
        </li>
        <li>
          <t><strong>Platform independence</strong>: Standard ZIP format supported across all platforms</t>
        </li>
        <li>
          <t><strong>Simplicity</strong>: Flat structure with hash-based file naming eliminates the need for mapping manifests</t>
        </li>
        <li>
          <t><strong>Offline processing</strong>: No network dependencies after bundle creation</t>
        </li>
      </ol>
      <section anchor="requirements">
        <name>Requirements Language</name>
        <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
        <?line -18?>

</section>
    </section>
    <section anchor="structure">
      <name>File Structure</name>
      <t>The vCon Zip Bundle (<tt>.vconz</tt> file) <bcp14>MUST</bcp14> follow this simplified structure designed for multi-vCon support and ease of use:</t>
      <figure anchor="bundle-structure">
        <name>vCon Zip Bundle Directory Structure</name>
        <artwork><![CDATA[
bundle.vconz
├── manifest.json                              # Bundle format identifiers
├── files/                                     # All media files (flat, deduplicated)
│   ├── sha512-GLy6IPa...UQ.wav               # Hash-named with file 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
]]></artwork>
      </figure>
      <section anchor="design-principles">
        <name>Design Principles</name>
        <t><strong>Flat File Structure</strong>: All media files are stored in a single <tt>files/</tt> directory, regardless of type (dialog, attachments, analysis). The vCon JSON already contains the semantic type information, eliminating the need for directory-based categorization.</t>
        <t><strong>Hash-Based Naming</strong>: Files are named by their <tt>content_hash</tt> value from the vCon, enabling:</t>
        <ul spacing="normal">
          <li>
            <t>Direct lookup without manifest files</t>
          </li>
          <li>
            <t>Automatic deduplication across multiple vCons</t>
          </li>
          <li>
            <t>Integrity verification through filename</t>
          </li>
        </ul>
        <t><strong>UUID-Based vCon Naming</strong>: Each vCon is stored as <tt>vcons/[uuid].json</tt>, making discovery trivial by scanning the directory.</t>
        <t><strong>No Metadata Folder</strong>: All necessary information is already in the vCon JSON files themselves. The bundle format relies on the vCon specification's built-in content_hash mechanism.</t>
      </section>
    </section>
    <section anchor="core-files">
      <name>Core Files</name>
      <section anchor="manifest">
        <name>manifest.json</name>
        <t>The top-level manifest contains only essential bundle format identifiers:</t>
        <figure anchor="example-manifest">
          <name>Example manifest.json</name>
          <sourcecode type="json"><![CDATA[
{
  "format": "vcon-bundle",
  "version": "1.0"
}
]]></sourcecode>
        </figure>
        <t><strong>Parameters:</strong></t>
        <ul spacing="normal">
          <li>
            <t><tt>format</tt>: <bcp14>MUST</bcp14> be "vcon-bundle"</t>
          </li>
          <li>
            <t><tt>version</tt>: Bundle format version (this specification defines version "1.0")</t>
          </li>
        </ul>
        <t>Bundle consumers discover vCons by scanning the <tt>vcons/</tt> directory. No vCon enumeration is maintained in the manifest.</t>
      </section>
      <section anchor="vcon-files">
        <name>vCon JSON Files</name>
        <t>Each vCon is stored in the <tt>vcons/</tt> directory as <tt>[uuid].json</tt>:</t>
        <ul spacing="normal">
          <li>
            <t>Filename <bcp14>MUST</bcp14> be the vCon's UUID followed by <tt>.json</tt></t>
          </li>
          <li>
            <t>Content <bcp14>MUST</bcp14> be the complete, original vCon in any security form (unsigned, signed JWS, encrypted JWE)</t>
          </li>
          <li>
            <t>All external URL references and content_hash values <bcp14>MUST</bcp14> be preserved exactly as received</t>
          </li>
        </ul>
        <section anchor="security-forms">
          <name>Security Form Handling</name>
          <t><strong>Unsigned vCons</strong>: Stored directly as JSON object</t>
          <t><strong>Signed vCons (JWS)</strong>: The complete JWS structure <bcp14>MUST</bcp14> be preserved, including:</t>
          <ul spacing="normal">
            <li>
              <t>JWS headers with signature algorithms and keys</t>
            </li>
            <li>
              <t>Base64url-encoded payload containing the actual vCon</t>
            </li>
            <li>
              <t>Signature verification data</t>
            </li>
          </ul>
          <t><strong>Encrypted vCons (JWE)</strong>: The complete JWE structure <bcp14>MUST</bcp14> be preserved, including:</t>
          <ul spacing="normal">
            <li>
              <t>JWE headers with encryption algorithms and key information</t>
            </li>
            <li>
              <t>Encrypted payload (which may contain a signed vCon)</t>
            </li>
            <li>
              <t>All encryption metadata required for decryption</t>
            </li>
          </ul>
          <t>Bundle creators <bcp14>MUST NOT</bcp14> modify the vCon content, decrypt encrypted vCons, or remove signatures.</t>
          <t>Bundle creators <bcp14>MAY</bcp14> extract embedded files from an unsigned or unencrypted vCon and replace them with external references. When doing so, the creator <bcp14>MUST</bcp14> upload the extracted content to an accessible HTTPS URL, compute the appropriate content_hash, and update the vCon JSON to include the <tt>url</tt> and <tt>content_hash</tt> fields while removing inline <tt>body</tt> and <tt>encoding</tt> fields.</t>
        </section>
      </section>
      <section anchor="file-lookup">
        <name>File Lookup Mechanism</name>
        <t>To resolve a file reference from a vCon:</t>
        <ol spacing="normal" type="1"><li>
            <t>Read the <tt>content_hash</tt> field from the vCon object (dialog, attachment, or analysis)</t>
          </li>
          <li>
            <t>Extract the hash algorithm and value (e.g., <tt>"sha512-GLy6IPa..."</tt>)</t>
          </li>
          <li>
            <t>Look in <tt>files/</tt> for files matching <tt>[content_hash]</tt> with any extension</t>
          </li>
          <li>
            <t>The extension is provided for unzip/extraction friendliness and is determined by the file's media type (see <xref target="extension-determination"/>)</t>
          </li>
        </ol>
        <t>Example: If a dialog entry has <tt>"content_hash": "sha512-GLy6IPaIUM1...UQ"</tt> and <tt>"mediatype": "audio/wav"</tt>, the file will be located at <tt>files/sha512-GLy6IPaIUM1...UQ.wav</tt>.</t>
      </section>
    </section>
    <section anchor="file-naming">
      <name>File Naming Conventions</name>
      <section anchor="hash-filenames">
        <name>Hash-Based Filenames</name>
        <t>All externally referenced files <bcp14>MUST</bcp14> be stored using their content hash as the filename, ensuring:</t>
        <ul spacing="normal">
          <li>
            <t><strong>Uniqueness</strong>: Hash-based names prevent collisions</t>
          </li>
          <li>
            <t><strong>Integrity</strong>: Filename directly corresponds to content verification</t>
          </li>
          <li>
            <t><strong>Deduplication</strong>: Identical content (same hash) reuses the same file across multiple vCons</t>
          </li>
          <li>
            <t><strong>Direct lookup</strong>: No manifest needed to map URLs to files</t>
          </li>
        </ul>
        <t>Files <bcp14>MUST</bcp14> be named using the following pattern:</t>
        <artwork><![CDATA[
[hash-algorithm]-[base64url-hash].[extension]
]]></artwork>
        <t>Implementations <bcp14>MUST</bcp14> support SHA-512 as defined in the vCon specification. Additional hash algorithms <bcp14>MAY</bcp14> be supported as specified in the vCon <tt>content_hash</tt> field.</t>
        <t>Examples:</t>
        <ul spacing="normal">
          <li>
            <t><tt>sha512-GLy6IPaIUM1GqzZqfIPZlWjaDsNgNvZM0iCONNThnH0a75fhUM6cYzLZ5GynSURREvZwmOh54-2lRRieyj82UQ.wav</tt></t>
          </li>
          <li>
            <t><tt>sha256-Abc123DefGhi456JklMno789PqrStu012VwxYz345.mp4</tt> (if content_hash specifies SHA-256)</t>
          </li>
          <li>
            <t><tt>sha512-Def456UVW789XyzAbcDefGhi123JklMnoPqrStuVwxYz456AbcDefGhi789JklMno012PqrStuVwxYzA.pdf</tt></t>
          </li>
        </ul>
      </section>
      <section anchor="extension-determination">
        <name>Extension Determination</name>
        <t>File extensions <bcp14>MUST</bcp14> be determined by the following priority:</t>
        <ol spacing="normal" type="1"><li>
            <t><strong>MIME type</strong> from vCon <tt>mimetype</tt> field (preferred)
            </t>
            <ul spacing="normal">
              <li>
                <t>Use standard MIME type to extension mappings (e.g., "audio/wav" → ".wav")</t>
              </li>
            </ul>
          </li>
          <li>
            <t><strong>Content analysis</strong> of the file header
            </t>
            <ul spacing="normal">
              <li>
                <t>Inspect magic bytes to determine file type</t>
              </li>
            </ul>
          </li>
          <li>
            <t><strong>Original URL extension</strong> as fallback
            </t>
            <ul spacing="normal">
              <li>
                <t>Extract extension from the URL path if available</t>
              </li>
            </ul>
          </li>
          <li>
            <t><strong>Generic extension</strong> (<tt>.bin</tt>) if undetermined</t>
          </li>
        </ol>
        <t>The extension enables operating systems and tools to handle files appropriately when the bundle is extracted.</t>
      </section>
      <section anchor="multi-hash">
        <name>Multi-Hash Support</name>
        <t>When a vCon references files with multiple content hashes (as per vCon specification: <tt>"ContentHash" | "ContentHash[]"</tt>), implementations <bcp14>MUST</bcp14>:</t>
        <ol spacing="normal" type="1"><li>
            <t><strong>Primary hash</strong>: Use the first hash algorithm in the array for filename generation</t>
          </li>
          <li>
            <t><strong>Preferred hash</strong>: If SHA-512 is present in the array, it <bcp14>SHOULD</bcp14> be used as primary regardless of position</t>
          </li>
          <li>
            <t><strong>Validation</strong>: Verify ALL provided hashes during bundle creation and extraction</t>
          </li>
        </ol>
        <t>Example: If <tt>content_hash</tt> is <tt>["sha256-Abc...", "sha512-Def..."]</tt>, the file <bcp14>SHOULD</bcp14> be named <tt>sha512-Def....ext</tt>.</t>
      </section>
    </section>
    <section anchor="vcon-references">
      <name>vCon References and Relationships</name>
      <section anchor="group-objects">
        <name>Group Objects</name>
        <t>vCons may reference other vCons through Group Objects (Section 4.6 of <xref target="I-D.ietf-vcon-vcon-core"/>). These references aggregate multiple vCons into a logical conversation.</t>
        <t>When a vCon references another vCon via a Group Object:</t>
        <ul spacing="normal">
          <li>
            <t>The referenced vCon <bcp14>SHOULD</bcp14> be included in the bundle as a separate file in <tt>vcons/[uuid].json</tt></t>
          </li>
          <li>
            <t>The Group Object's <tt>uuid</tt> field enables discovery of the referenced vCon</t>
          </li>
          <li>
            <t>If the Group Object includes a <tt>url</tt> with a <tt>content_hash</tt>, the bundler <bcp14>MAY</bcp14> include a copy of the URL-based reference in the bundle</t>
          </li>
          <li>
            <t>Bundle readers <bcp14>SHOULD</bcp14> check if the content_hash exists in the bundle's <tt>files/</tt> directory before attempting external URL resolution</t>
          </li>
        </ul>
      </section>
      <section anchor="vcon-discovery">
        <name>Referenced vCon Discovery</name>
        <t>To discover all vCons in a bundle and their relationships:</t>
        <ol spacing="normal" type="1"><li>
            <t>Scan <tt>vcons/</tt> directory for all <tt>*.json</tt> files</t>
          </li>
          <li>
            <t>For each vCon, check for <tt>group[]</tt> array entries with <tt>uuid</tt> fields</t>
          </li>
          <li>
            <t>Verify that referenced vCons are present in the bundle (if intended)</t>
          </li>
          <li>
            <t>Build relationship graph of vCons based on these references</t>
          </li>
        </ol>
      </section>
    </section>
    <section anchor="bundle-creation">
      <name>Bundle Creation Process</name>
      <section anchor="creation-security-handling">
        <name>vCon Security Form Handling</name>
        <t>Bundle creators <bcp14>MUST</bcp14> handle different vCon security forms appropriately:</t>
        <t><strong>For Unsigned vCons:</strong></t>
        <ol spacing="normal" type="1"><li>
            <t><bcp14>MUST</bcp14> parse JSON directly to identify external references</t>
          </li>
          <li>
            <t><bcp14>MUST</bcp14> proceed with standard file resolution</t>
          </li>
        </ol>
        <t><strong>For Signed vCons (JWS):</strong></t>
        <ol spacing="normal" type="1"><li>
            <t><bcp14>MUST</bcp14> preserve complete JWS structure in the output vCon file</t>
          </li>
          <li>
            <t><bcp14>SHOULD</bcp14> verify signature before processing</t>
          </li>
          <li>
            <t><bcp14>MUST</bcp14> parse base64url-decoded payload to identify external references</t>
          </li>
          <li>
            <t><bcp14>MUST</bcp14> resolve external files based on payload content</t>
          </li>
        </ol>
        <t><strong>For Encrypted vCons (JWE):</strong></t>
        <ol spacing="normal" type="1"><li>
            <t><bcp14>MUST</bcp14> preserve complete JWE structure in the output vCon file</t>
          </li>
          <li>
            <t>If decryption keys are available, bundle creator <bcp14>SHOULD</bcp14> decrypt to resolve external references</t>
          </li>
          <li>
            <t>If decryption keys are unavailable, the bundle creator <bcp14>MUST</bcp14> include the encrypted vCon without resolving external references or including associated files</t>
          </li>
          <li>
            <t>When keys are available, <bcp14>MUST</bcp14> parse decrypted content (which may itself be signed) to identify external references</t>
          </li>
          <li>
            <t><bcp14>MUST</bcp14> save original encrypted JWE structure after file resolution (not decrypted content)</t>
          </li>
        </ol>
      </section>
      <section anchor="file-resolution">
        <name>External File Resolution</name>
        <t>For each vCon being bundled:</t>
        <ol spacing="normal" type="1"><li>
            <t><strong>Parse vCon content</strong>: <bcp14>MUST</bcp14> parse according to security form to identify all external references:
            </t>
            <ul spacing="normal">
              <li>
                <t><tt>dialog[]</tt> entries with <tt>url</tt> and <tt>content_hash</tt></t>
              </li>
              <li>
                <t><tt>attachments[]</tt> entries with <tt>url</tt> and <tt>content_hash</tt></t>
              </li>
              <li>
                <t><tt>analysis[]</tt> entries with <tt>url</tt> and <tt>content_hash</tt></t>
              </li>
              <li>
                <t><tt>group[]</tt> entries with <tt>url</tt> and <tt>content_hash</tt> (for referenced vCons)</t>
              </li>
            </ul>
          </li>
          <li>
            <t><strong>Validate URLs</strong>: <bcp14>MUST</bcp14> ensure HTTPS protocol and validate URL accessibility</t>
          </li>
          <li>
            <t><strong>Download files</strong>: <bcp14>MUST</bcp14> download from HTTPS URLs with proper error handling and retry logic</t>
          </li>
          <li>
            <t><strong>Verify content hashes</strong>: <bcp14>MUST</bcp14> verify against downloaded content using ALL provided hash algorithms
            </t>
            <ul spacing="normal">
              <li>
                <t><bcp14>MUST</bcp14> fail if any hash does not match</t>
              </li>
              <li>
                <t><bcp14>MUST</bcp14> support SHA-512 as primary algorithm</t>
              </li>
            </ul>
          </li>
          <li>
            <t><strong>Determine file extension</strong>: <bcp14>MUST</bcp14> determine using priority defined in <xref target="extension-determination"/></t>
          </li>
          <li>
            <t><strong>Generate filename</strong>: <bcp14>MUST</bcp14> use pattern <tt>[primary-content-hash].[extension]</tt></t>
          </li>
          <li>
            <t><strong>Check for duplicates</strong>: If file already exists in <tt>files/</tt> with same hash, <bcp14>MUST</bcp14> skip (automatic deduplication)</t>
          </li>
          <li>
            <t><strong>Store file</strong>: <bcp14>MUST</bcp14> add to <tt>files/</tt> directory if not already present</t>
          </li>
        </ol>
      </section>
      <section anchor="multi-vcon-creation">
        <name>Multi-vCon Bundle Creation</name>
        <t>When bundling multiple vCons:</t>
        <ol spacing="normal" type="1"><li>
            <t><strong>Collect all vCons</strong>: <bcp14>MUST</bcp14> identify all vCons to be included in the bundle</t>
          </li>
          <li>
            <t><strong>Resolve files for each vCon</strong>: <bcp14>MUST</bcp14> follow procedures in <xref target="file-resolution"/> for each vCon</t>
          </li>
          <li>
            <t><strong>Automatic deduplication</strong>: Files with identical content_hash values <bcp14>MUST</bcp14> be stored only once
            </t>
            <ul spacing="normal">
              <li>
                <t>This is especially useful when multiple vCons reference the same recording, attachment, or analysis</t>
              </li>
            </ul>
          </li>
          <li>
            <t><strong>Store each vCon</strong>: <bcp14>MUST</bcp14> store as <tt>vcons/[uuid].json</tt> while preserving original security form</t>
          </li>
          <li>
            <t><strong>Handle vCon references</strong>:
            </t>
            <ul spacing="normal">
              <li>
                <t>Bundle creator <bcp14>SHOULD</bcp14> include referenced vCons (via Group objects) when available</t>
              </li>
              <li>
                <t>If including referenced vCons, <bcp14>MUST</bcp14> add them to the <tt>vcons/</tt> directory</t>
              </li>
              <li>
                <t>UUIDs in the vCon JSON enable discovery without additional manifests</t>
              </li>
            </ul>
          </li>
        </ol>
      </section>
      <section anchor="bundle-assembly">
        <name>Bundle Assembly</name>
        <ol spacing="normal" type="1"><li>
            <t><strong>Create ZIP structure</strong>: <bcp14>MUST</bcp14> create the following directory structure:  </t>
            <artwork><![CDATA[
manifest.json
files/
vcons/
extensions/ (if applicable)
]]></artwork>
          </li>
          <li>
            <t><strong>Write manifest.json</strong>: <bcp14>MUST</bcp14> write with required format identifiers</t>
          </li>
          <li>
            <t><strong>Add all files</strong>: <bcp14>MUST</bcp14> add to <tt>files/</tt> directory with hash-based names</t>
          </li>
          <li>
            <t><strong>Add all vCons</strong>: <bcp14>MUST</bcp14> add to <tt>vcons/</tt> directory as <tt>[uuid].json</tt></t>
          </li>
          <li>
            <t><strong>Add extensions</strong>: If vCons use extensions (<xref target="extensibility"/>), <bcp14>MUST</bcp14> include extension data</t>
          </li>
          <li>
            <t><strong>Create ZIP archive</strong>: <bcp14>MUST</bcp14> create with appropriate compression settings</t>
          </li>
        </ol>
      </section>
      <section anchor="bundle-validation">
        <name>Bundle Validation</name>
        <t>Bundle creators <bcp14>MUST</bcp14> perform these validation steps:</t>
        <ol spacing="normal" type="1"><li>
            <t><strong>Hash verification</strong>: <bcp14>MUST</bcp14> verify all content hashes match downloaded content (all algorithms)</t>
          </li>
          <li>
            <t><strong>File completeness</strong>: <bcp14>MUST</bcp14> ensure all external references from all vCons are resolved and bundled</t>
          </li>
          <li>
            <t><strong>Security form integrity</strong>: <bcp14>MUST</bcp14> verify original signatures/encryption structures remain intact</t>
          </li>
          <li>
            <t><strong>UUID uniqueness</strong>: <bcp14>MUST</bcp14> verify no duplicate vCon UUIDs exist in <tt>vcons/</tt> directory</t>
          </li>
          <li>
            <t><strong>File accessibility</strong>: <bcp14>SHOULD</bcp14> verify all files in <tt>files/</tt> are referenced by at least one vCon</t>
          </li>
          <li>
            <t><strong>Manifest validity</strong>: <bcp14>MUST</bcp14> verify top-level manifest.json is valid JSON with all required fields</t>
          </li>
        </ol>
      </section>
    </section>
    <section anchor="bundle-extraction">
      <name>Bundle Extraction and Usage</name>
      <section anchor="extraction-process">
        <name>Extraction Process</name>
        <t>Bundle consumers <bcp14>MUST</bcp14> follow this extraction process:</t>
        <ol spacing="normal" type="1"><li>
            <t><strong>Extract ZIP</strong> to temporary or permanent directory</t>
          </li>
          <li>
            <t><strong>Validate bundle structure</strong>:
            </t>
            <ul spacing="normal">
              <li>
                <t><tt>manifest.json</tt> exists and is valid</t>
              </li>
              <li>
                <t><tt>vcons/</tt> directory exists</t>
              </li>
              <li>
                <t><tt>files/</tt> directory exists</t>
              </li>
            </ul>
          </li>
          <li>
            <t><strong>Load manifest.json</strong> and verify:
            </t>
            <ul spacing="normal">
              <li>
                <t><tt>format</tt> is "vcon-bundle"</t>
              </li>
              <li>
                <t><tt>version</tt> is supported (e.g., "1.0")</t>
              </li>
            </ul>
          </li>
          <li>
            <t><strong>Discover vCons</strong>: Scan <tt>vcons/</tt> directory for all <tt>*.json</tt> files</t>
          </li>
          <li>
            <t><strong>For each vCon</strong>:
            </t>
            <ul spacing="normal">
              <li>
                <t>Parse according to security form (unsigned/signed/encrypted)</t>
              </li>
              <li>
                <t>Identify file references via <tt>content_hash</tt> fields</t>
              </li>
              <li>
                <t>Verify files exist in <tt>files/</tt> directory</t>
              </li>
              <li>
                <t>Verify file integrity using content_hash values</t>
              </li>
            </ul>
          </li>
          <li>
            <t><strong>Build relationships</strong>: Check for vCon references (group[], redacted) to understand bundle structure</t>
          </li>
        </ol>
      </section>
      <section anchor="extraction-file-resolution">
        <name>File Resolution</name>
        <t>To access a file referenced in a vCon:</t>
        <ol spacing="normal" type="1"><li>
            <t>Extract <tt>content_hash</tt> from the vCon object (e.g., <tt>"sha512-GLy6IPa..."</tt>)</t>
          </li>
          <li>
            <t>Optionally extract <tt>mediatype</tt> to determine expected extension</t>
          </li>
          <li>
            <t>Look in <tt>files/</tt> directory for <tt>[content_hash].[ext]</tt>
            </t>
            <ul spacing="normal">
              <li>
                <t>If extension is known, search for exact match</t>
              </li>
              <li>
                <t>If extension is unknown, scan for any file starting with <tt>[content_hash].</tt></t>
              </li>
            </ul>
          </li>
          <li>
            <t>Verify file hash matches <tt>content_hash</tt> value (all algorithms if multiple provided)</t>
          </li>
          <li>
            <t>Use file content for processing</t>
          </li>
        </ol>
      </section>
      <section anchor="extraction-security-processing">
        <name>Security Form Processing</name>
        <t><strong>For Signed vCons:</strong></t>
        <ul spacing="normal">
          <li>
            <t>Bundle consumers <bcp14>SHOULD</bcp14> verify JWS signatures using appropriate keys</t>
          </li>
          <li>
            <t>Signature verification failure <bcp14>SHOULD</bcp14> result in processing warnings or errors</t>
          </li>
          <li>
            <t>Consumers <bcp14>MAY</bcp14> choose to process unsigned payloads with appropriate warnings</t>
          </li>
        </ul>
        <t><strong>For Encrypted vCons:</strong></t>
        <ul spacing="normal">
          <li>
            <t>Bundle consumers <bcp14>MAY</bcp14> have appropriate decryption keys</t>
          </li>
          <li>
            <t>Decryption is optional and only possible if keys are available</t>
          </li>
          <li>
            <t>If decryption keys are unavailable, consumers <bcp14>MAY</bcp14> process the encrypted vCon metadata without accessing the encrypted payload</t>
          </li>
          <li>
            <t>Decrypted content may itself be signed and require signature verification</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="extensibility">
      <name>Extensibility</name>
      <section anchor="future-extensions">
        <name>Future vCon Extensions</name>
        <t>The <tt>extensions/</tt> directory provides support for future vCon extensions that define custom parameters or file types beyond the core specification.</t>
        <t><strong>Directory Structure:</strong></t>
        <figure anchor="extension-structure">
          <name>Extension Directory Structure</name>
          <artwork><![CDATA[
extensions/
└── [extension-name]/
    ├── metadata.json          # Extension metadata and schema
    └── files/                 # Extension-specific files (if needed)
        └── [hash-based-names] # Following same naming conventions
]]></artwork>
        </figure>
        <t><strong>Extension Guidelines:</strong></t>
        <ul spacing="normal">
          <li>
            <t>Each extension <bcp14>MUST</bcp14> have its own subdirectory named after the extension</t>
          </li>
          <li>
            <t>Extension-specific files <bcp14>SHOULD</bcp14> follow same hash-based naming conventions</t>
          </li>
          <li>
            <t>Extension metadata <bcp14>MUST</bcp14> be stored in <tt>extensions/[name]/metadata.json</tt></t>
          </li>
          <li>
            <t>Extensions <bcp14>SHOULD</bcp14> use <tt>files/</tt> directory for standard media files (dialog, attachments, analysis)</t>
          </li>
          <li>
            <t>Extensions <bcp14>MAY</bcp14> use <tt>extensions/[name]/files/</tt> for extension-specific file types</t>
          </li>
        </ul>
        <t><strong>Extension Metadata Schema:</strong></t>
        <figure anchor="extension-metadata">
          <name>Example Extension Metadata</name>
          <sourcecode type="json"><![CDATA[
{
  "extension_name": "mimi-messages",
  "extension_version": "1.0",
  "vcon_version_compatibility": ["0.3.0"],
  "bundle_format_version": "1.0",
  "description": "MIMI protocol message support for vCon"
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="versioning">
        <name>Bundle Format Versioning</name>
        <ul spacing="normal">
          <li>
            <t>Bundle format version <bcp14>MUST</bcp14> be tracked in manifest.json</t>
          </li>
          <li>
            <t>This specification defines version "1.0" (multi-vCon with simplified structure)</t>
          </li>
          <li>
            <t>Forward/backward compatibility handled via version negotiation</t>
          </li>
          <li>
            <t>New versions <bcp14>MAY</bcp14> add directories or fields to manifest.json</t>
          </li>
          <li>
            <t>New versions <bcp14>MUST NOT</bcp14> break existing core structure</t>
          </li>
          <li>
            <t>Implementations <bcp14>SHOULD</bcp14> support at least one previous major version</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="security">
      <name>Security Considerations</name>
      <section anchor="content-verification">
        <name>Content Verification</name>
        <ul spacing="normal">
          <li>
            <t>All files <bcp14>MUST</bcp14> be verified against ALL provided content_hash values before inclusion</t>
          </li>
          <li>
            <t>Bundle creators <bcp14>MUST</bcp14> validate HTTPS certificate chains when downloading external files</t>
          </li>
          <li>
            <t>Hash algorithms <bcp14>MUST</bcp14> include SHA-512 as required by vCon specification</t>
          </li>
          <li>
            <t>Additional hash algorithms <bcp14>MAY</bcp14> be supported as specified in vCon content_hash arrays</t>
          </li>
          <li>
            <t>Bundle creators <bcp14>MUST</bcp14> fail bundle creation if any content hash verification fails</t>
          </li>
          <li>
            <t>Bundle consumers <bcp14>MUST</bcp14> verify file hashes during extraction to detect tampering</t>
          </li>
        </ul>
      </section>
      <section anchor="security-form-preservation">
        <name>vCon Security Form Preservation</name>
        <ul spacing="normal">
          <li>
            <t><strong>Signed vCons</strong>: Bundle creators <bcp14>MUST</bcp14> preserve complete JWS structure and <bcp14>SHOULD</bcp14> verify signatures</t>
          </li>
          <li>
            <t><strong>Encrypted vCons</strong>: Bundle creators <bcp14>MUST</bcp14> preserve complete JWE structure</t>
          </li>
          <li>
            <t><strong>Security downgrades</strong>: Bundle creators <bcp14>MUST NOT</bcp14> convert signed/encrypted vCons to unsigned form</t>
          </li>
          <li>
            <t><strong>Key management</strong>: Bundle creators are responsible for having appropriate keys for encrypted vCons</t>
          </li>
          <li>
            <t><strong>Signature verification</strong>: Bundle consumers <bcp14>SHOULD</bcp14> verify JWS signatures before trusting vCon content</t>
          </li>
        </ul>
      </section>
      <section anchor="privacy">
        <name>Privacy Protection</name>
        <ul spacing="normal">
          <li>
            <t>Bundle creators <bcp14>MUST</bcp14> preserve any privacy controls from original vCons</t>
          </li>
          <li>
            <t>Redacted vCons <bcp14>MUST</bcp14> maintain redaction integrity in bundles</t>
          </li>
          <li>
            <t>Unredacted vCons referenced by redacted vCons <bcp14>SHOULD</bcp14> have access controls enforced</t>
          </li>
          <li>
            <t>Party identification information <bcp14>MUST</bcp14> be handled according to applicable privacy regulations</t>
          </li>
          <li>
            <t>Bundle-level encryption (ZIP encryption) <bcp14>MAY</bcp14> be used but does not replace vCon-level security</t>
          </li>
        </ul>
      </section>
      <section anchor="deduplication-security">
        <name>File Deduplication Security</name>
        <t>Deduplication via content_hash is safe because:</t>
        <ul spacing="normal">
          <li>
            <t>Same hash means identical content (cryptographic guarantee with SHA-512)</t>
          </li>
          <li>
            <t>No information leakage from file reuse across vCons</t>
          </li>
          <li>
            <t>Each vCon's content_hash values are independently verifiable</t>
          </li>
        </ul>
        <t>Bundle consumers <bcp14>SHOULD</bcp14> verify that shared files have identical content_hash in all referencing vCons.</t>
      </section>
      <section anchor="threat-model">
        <name>Threat Model Considerations</name>
        <ul spacing="normal">
          <li>
            <t><strong>Tamper detection</strong>: Content hashes provide integrity verification for individual files</t>
          </li>
          <li>
            <t><strong>Bundle integrity</strong>: Complete bundle integrity depends on:
            </t>
            <ul spacing="normal">
              <li>
                <t>ZIP file integrity</t>
              </li>
              <li>
                <t>Individual file hash verification</t>
              </li>
              <li>
                <t>vCon signature verification (for signed vCons)</t>
              </li>
            </ul>
          </li>
          <li>
            <t><strong>Key exposure</strong>: Encrypted vCons protect against key exposure better than ZIP-level encryption</t>
          </li>
          <li>
            <t><strong>Metadata leakage</strong>: File names (hashes) and vCon structure may reveal conversation patterns even if content is encrypted</t>
          </li>
        </ul>
      </section>
      <section anchor="bundle-security">
        <name>Bundle-Level Security</name>
        <ul spacing="normal">
          <li>
            <t><strong>ZIP encryption</strong>: <bcp14>MAY</bcp14> be used for additional protection but <bcp14>MUST NOT</bcp14> replace vCon-level security</t>
          </li>
          <li>
            <t><strong>Compression</strong>: <bcp14>SHOULD</bcp14> be applied judiciously to avoid side-channel analysis via compressed size</t>
          </li>
          <li>
            <t><strong>File permissions</strong>: Bundle extractors <bcp14>SHOULD</bcp14> set appropriate file permissions on extracted content</t>
          </li>
          <li>
            <t><strong>Temporary files</strong>: Bundle creators <bcp14>SHOULD</bcp14> securely delete temporary files containing sensitive content</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="iana">
      <name>IANA Considerations</name>
      <section anchor="media-type">
        <name>Media Type Registration</name>
        <t>This specification defines a new media type for vCon Zip Bundle (<tt>.vconz</tt>) files and requests IANA registration:</t>
        <t><strong>Type name:</strong> application</t>
        <t><strong>Subtype name:</strong> vcon+zip</t>
        <t><strong>Required parameters:</strong> None</t>
        <t><strong>Optional parameters:</strong></t>
        <ul spacing="normal">
          <li>
            <t>version: Bundle format version (default "1.0")</t>
          </li>
          <li>
            <t>vcon-version: Source vCon specification version</t>
          </li>
        </ul>
        <t><strong>Encoding considerations:</strong> Binary (ZIP archive)</t>
        <t><strong>Security considerations:</strong> See <xref target="security"/></t>
        <t><strong>Interoperability considerations:</strong> Standard ZIP format with specific internal structure</t>
        <t><strong>Published specification:</strong> This document</t>
        <t><strong>Applications that use this media type:</strong> vCon processing tools, conversation analysis systems, conversation archives</t>
        <t><strong>Fragment identifier considerations:</strong> Not applicable</t>
        <t><strong>Additional information:</strong></t>
        <ul spacing="normal">
          <li>
            <t><strong>Magic number:</strong> ZIP signature (0x504B0304) with manifest.json as first entry</t>
          </li>
          <li>
            <t><strong>File extensions:</strong> .vconz</t>
          </li>
          <li>
            <t><strong>Macintosh file type code:</strong> Not assigned</t>
          </li>
          <li>
            <t><strong>Uniform Type Identifier:</strong> public.vcon-zip-bundle</t>
          </li>
        </ul>
        <t><strong>Person &amp; email address to contact:</strong> Jeremie Miller <eref target="mailto:jeremie.miller@gmail.com">jeremie.miller@gmail.com</eref></t>
        <t><strong>Intended usage:</strong> COMMON</t>
        <t><strong>Restrictions on usage:</strong> None</t>
        <t><strong>Author:</strong> Jeremie Miller</t>
        <t><strong>Change controller:</strong> IETF</t>
      </section>
    </section>
    <section anchor="implementation">
      <name>Implementation Guidelines</name>
      <section anchor="required-features">
        <name>Required Features</name>
        <t>Implementations <bcp14>MUST</bcp14> support:</t>
        <ul spacing="normal">
          <li>
            <t>Multi-vCon bundling with automatic file deduplication</t>
          </li>
          <li>
            <t>All four vCon content arrays (parties, dialog, analysis, attachments)</t>
          </li>
          <li>
            <t>All three vCon security forms (unsigned, signed JWS, encrypted JWE)</t>
          </li>
          <li>
            <t>SHA-512 content hash verification as primary algorithm</t>
          </li>
          <li>
            <t>Hash-based file naming with extension determination</t>
          </li>
          <li>
            <t>Standard ZIP format with specified directory structure</t>
          </li>
          <li>
            <t>vCon discovery via <tt>vcons/</tt> directory scanning</t>
          </li>
          <li>
            <t>File lookup via content_hash values in vCon JSON</t>
          </li>
          <li>
            <t>Group object reference handling</t>
          </li>
        </ul>
      </section>
      <section anchor="recommended-features">
        <name>Recommended Features</name>
        <t>Implementations <bcp14>SHOULD</bcp14> support:</t>
        <ul spacing="normal">
          <li>
            <t>JWS signature verification for signed vCons</t>
          </li>
          <li>
            <t>JWE decryption for encrypted vCons (with appropriate keys)</t>
          </li>
          <li>
            <t>Additional hash algorithms (SHA-256) for broader compatibility</t>
          </li>
          <li>
            <t>Bundle validation and integrity checking tools</t>
          </li>
          <li>
            <t>Extension directory support for future vCon extensions</t>
          </li>
          <li>
            <t>Efficient handling of large media files (streaming)</t>
          </li>
        </ul>
      </section>
      <section anchor="optional-features">
        <name>Optional Features</name>
        <t>Implementations <bcp14>MAY</bcp14> support:</t>
        <ul spacing="normal">
          <li>
            <t>Compression optimization for specific media types</t>
          </li>
          <li>
            <t>Incremental bundle updates (adding/removing vCons)</t>
          </li>
          <li>
            <t>Bundle format version migration tools</t>
          </li>
          <li>
            <t>Custom extension handling beyond core specification</t>
          </li>
          <li>
            <t>ZIP-level encryption for additional security</t>
          </li>
          <li>
            <t>Automated re-publishing tools for bundle-to-external conversion</t>
          </li>
          <li>
            <t>Bundle analysis tools (relationship graphs, statistics)</t>
          </li>
        </ul>
      </section>
      <section anchor="implementation-validation">
        <name>Implementation Validation</name>
        <t>Implementations <bcp14>SHOULD</bcp14> provide validation for:</t>
        <ul spacing="normal">
          <li>
            <t>Bundle structure completeness (required directories and files)</t>
          </li>
          <li>
            <t>Content hash verification (all algorithms)</t>
          </li>
          <li>
            <t>vCon relationship integrity (group references)</t>
          </li>
          <li>
            <t>Security form preservation (signatures/encryption intact)</t>
          </li>
          <li>
            <t>UUID uniqueness across all vCons</t>
          </li>
          <li>
            <t>File reference completeness (all referenced files present)</t>
          </li>
          <li>
            <t>Extension compatibility</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="examples">
      <name>Examples</name>
      <section anchor="example-single">
        <name>Single vCon Bundle (Unsigned)</name>
        <figure anchor="example-single-structure">
          <name>Single vCon Bundle Structure</name>
          <artwork><![CDATA[
simple-call.vconz
├── manifest.json                              # Format: vcon-bundle v1.0
├── files/
│   ├── sha512-GLy6IPa...UQ.wav               # Audio recording
│   └── sha512-Transcript...XYZ.json          # Generated transcript
└── vcons/
    └── 0195544a-b9b1-8ee4-b9a2-279e0d16bc46.json  # Unsigned vCon
]]></artwork>
        </figure>
      </section>
      <section anchor="example-multi">
        <name>Multi-vCon Bundle with Shared Files</name>
        <figure anchor="example-multi-structure">
          <name>Multi-vCon Bundle with Deduplication</name>
          <artwork><![CDATA[
support-case-bundle.vconz
├── manifest.json
├── files/
│   ├── sha512-Call1Audio...ABC.wav           # First call recording
│   ├── sha512-Call2Audio...DEF.wav           # Second call recording
│   ├── sha512-SharedDoc...GHI.pdf            # Document referenced by both vCons (deduplicated!)
│   ├── sha512-Transcript1...JKL.json         # First call transcript
│   └── sha512-Transcript2...MNO.json         # Second call transcript
└── vcons/
    ├── 0195544a-b9b1-8ee4-b9a2-279e0d16bc46.json  # First call vCon
    └── 0195544b-c2d3-4e5f-6a7b-8c9d0e1f2a3b.json  # Second call vCon (same case)
]]></artwork>
        </figure>
        <t>Note: <tt>sha512-SharedDoc...GHI.pdf</tt> is referenced by both vCons but stored only once due to automatic deduplication.</t>
      </section>
      <section anchor="example-signed">
        <name>Signed vCon with Encrypted Attachment</name>
        <figure anchor="example-signed-structure">
          <name>Signed vCon Bundle</name>
          <artwork><![CDATA[
secure-conference.vconz
├── manifest.json
├── files/
│   ├── sha512-VideoConf...PQR.mp4            # Video recording
│   ├── sha512-Slides...STU.pdf               # Presentation slides
│   └── sha512-ConfReport...VWX.json          # Conference summary
└── vcons/
    └── 0195544c-1234-5678-9abc-def012345678.json  # JWS-signed vCon
]]></artwork>
        </figure>
      </section>
      <section anchor="example-group">
        <name>Group of Related vCons</name>
        <figure anchor="example-group-structure">
          <name>Group of Related vCons</name>
          <artwork><![CDATA[
conversation-thread.vconz
├── manifest.json
├── files/
│   ├── sha512-EmailThread...ABC.json         # Email conversation
│   ├── sha512-ChatLog...DEF.json            # Chat messages
│   └── sha512-PhoneCall...GHI.wav           # Follow-up phone call
└── vcons/
    ├── 01955450-aaaa-1111-2222-333344445555.json  # Email vCon
    ├── 01955451-bbbb-3333-4444-555566667777.json  # Chat vCon
    ├── 01955452-cccc-5555-6666-777788889999.json  # Phone vCon
    └── 01955453-dddd-7777-8888-999900001111.json  # Aggregate vCon (has group[] references to others)
]]></artwork>
        </figure>
      </section>
      <section anchor="example-redacted">
        <name>Redacted vCon Bundle</name>
        <figure anchor="example-redacted-structure">
          <name>Redacted vCon Bundle</name>
          <artwork><![CDATA[
redacted-support-call.vconz
├── manifest.json
├── files/
│   ├── sha512-RedactedAudio...ABC.wav        # PII redacted audio
│   ├── sha512-OriginalAudio...DEF.wav        # Original unredacted audio
│   └── sha512-RedactedTranscript...GHI.json  # Redacted transcript
└── vcons/
    ├── 01955460-aaaa-bbbb-cccc-ddddeeeeeeee.json  # Unredacted vCon (original)
    └── 01955461-ffff-gggg-hhhh-iiiijjjjkkkk.json  # Redacted vCon with PII removed
]]></artwork>
        </figure>
      </section>
      <section anchor="example-extension">
        <name>vCon with Extension</name>
        <figure anchor="example-extension-structure">
          <name>vCon with Extension</name>
          <artwork><![CDATA[
mimi-messages.vconz
├── manifest.json
├── files/
│   └── sha512-ChatMessages...ABC.json        # MIMI message content
├── vcons/
│   └── 01955470-1111-2222-3333-444455556666.json  # vCon with MIMI extension
└── extensions/
    └── mimi-messages/
        ├── metadata.json                      # MIMI extension metadata
        └── files/
            └── sha256-MsgMetadata...DEF.cbor  # MIMI-specific metadata
]]></artwork>
        </figure>
      </section>
      <section anchor="example-minimal">
        <name>Minimal Bundle (Empty Arrays)</name>
        <figure anchor="example-minimal-structure">
          <name>Minimal vCon Bundle</name>
          <artwork><![CDATA[
minimal.vconz
├── manifest.json
└── vcons/
    └── 01955480-aaaa-bbbb-cccc-ddddeeeeeeee.json  # vCon with empty dialog/analysis/attachments arrays
]]></artwork>
        </figure>
        <t>Note: No <tt>files/</tt> directory needed since there are no external references.</t>
      </section>
    </section>
    <section anchor="error-handling">
      <name>Error Handling and Edge Cases</name>
      <section anchor="creation-errors">
        <name>Bundle Creation Errors</name>
        <t>Implementations <bcp14>MUST</bcp14> handle these error conditions:</t>
        <t><strong>External File Resolution Errors:</strong></t>
        <ul spacing="normal">
          <li>
            <t><strong>Network failures</strong>: <bcp14>SHOULD</bcp14> retry with exponential backoff, <bcp14>MUST</bcp14> fail after maximum attempts</t>
          </li>
          <li>
            <t><strong>Hash mismatches</strong>: <bcp14>MUST</bcp14> fail bundle creation with detailed error message showing expected vs actual hash</t>
          </li>
          <li>
            <t><strong>Missing files</strong>: <bcp14>MUST</bcp14> fail bundle creation unless explicitly configured to skip</t>
          </li>
          <li>
            <t><strong>Access denied (403/401)</strong>: <bcp14>MUST</bcp14> fail with security error, <bcp14>MUST NOT</bcp14> retry</t>
          </li>
        </ul>
        <t><strong>vCon Security Form Errors:</strong></t>
        <ul spacing="normal">
          <li>
            <t><strong>Invalid JWS signatures</strong>: Bundle creators <bcp14>SHOULD</bcp14> warn but <bcp14>MAY</bcp14> continue</t>
          </li>
          <li>
            <t><strong>JWE decryption failures</strong>: <bcp14>MUST</bcp14> fail bundle creation for encrypted vCons</t>
          </li>
          <li>
            <t><strong>Missing decryption keys</strong>: <bcp14>MUST</bcp14> fail with clear error message about key requirements</t>
          </li>
          <li>
            <t><strong>Malformed JWS/JWE structures</strong>: <bcp14>MUST</bcp14> fail with structural validation errors</t>
          </li>
        </ul>
        <t><strong>Validation Errors:</strong></t>
        <ul spacing="normal">
          <li>
            <t><strong>Invalid vCon structure</strong>: <bcp14>MUST</bcp14> fail with schema validation errors</t>
          </li>
          <li>
            <t><strong>Missing UUID</strong>: <bcp14>MUST</bcp14> fail (UUID required for filename)</t>
          </li>
          <li>
            <t><strong>Duplicate UUIDs</strong>: <bcp14>MUST</bcp14> fail or prompt user for conflict resolution</t>
          </li>
          <li>
            <t><strong>Broken vCon references</strong>: WARN if group[] references non-existent vCons</t>
          </li>
        </ul>
      </section>
      <section anchor="extraction-errors">
        <name>Bundle Extraction Errors</name>
        <t>Implementations <bcp14>MUST</bcp14> handle these extraction scenarios:</t>
        <t><strong>Bundle Integrity Errors:</strong></t>
        <ul spacing="normal">
          <li>
            <t><strong>Corrupted ZIP</strong>: <bcp14>MUST</bcp14> fail with file corruption error</t>
          </li>
          <li>
            <t><strong>Missing manifest.json</strong>: <bcp14>MUST</bcp14> fail</t>
          </li>
          <li>
            <t><strong>Missing vcons/ directory</strong>: <bcp14>MUST</bcp14> fail</t>
          </li>
          <li>
            <t><strong>Hash verification failures</strong>: <bcp14>MUST</bcp14> fail unless configured for warnings</t>
          </li>
        </ul>
        <t><strong>Security Processing Errors:</strong></t>
        <ul spacing="normal">
          <li>
            <t><strong>JWS signature verification failures</strong>: <bcp14>SHOULD</bcp14> warn, <bcp14>MAY</bcp14> continue based on policy</t>
          </li>
          <li>
            <t><strong>JWE decryption failures</strong>: <bcp14>MUST</bcp14> fail with key-related error message</t>
          </li>
          <li>
            <t><strong>Downgrade attacks</strong>: <bcp14>MUST</bcp14> detect and prevent security form downgrades</t>
          </li>
        </ul>
        <t><strong>File Resolution Errors:</strong></t>
        <ul spacing="normal">
          <li>
            <t><strong>Missing files</strong>: <bcp14>MUST</bcp14> fail or warn if file referenced in vCon is not in <tt>files/</tt></t>
          </li>
          <li>
            <t><strong>Hash mismatches</strong>: <bcp14>MUST</bcp14> fail if file content doesn't match content_hash</t>
          </li>
          <li>
            <t><strong>Orphaned files</strong>: <bcp14>MAY</bcp14> warn if files in <tt>files/</tt> are not referenced by any vCon</t>
          </li>
        </ul>
      </section>
      <section anchor="edge-cases">
        <name>Edge Case Handling</name>
        <t><strong>Empty vCon Arrays:</strong></t>
        <ul spacing="normal">
          <li>
            <t>Bundles with vCons containing empty dialog, analysis, or attachments arrays are valid</t>
          </li>
          <li>
            <t>No <tt>files/</tt> directory is required if no vCons have external references</t>
          </li>
          <li>
            <t>Minimal bundle can be just <tt>manifest.json</tt> and <tt>vcons/[uuid].json</tt></t>
          </li>
        </ul>
        <t><strong>Large File Handling:</strong></t>
        <ul spacing="normal">
          <li>
            <t>Implementations <bcp14>SHOULD</bcp14> support streaming for large media files during bundle creation</t>
          </li>
          <li>
            <t>Bundle size limits <bcp14>MAY</bcp14> be implemented with clear error messages</t>
          </li>
          <li>
            <t>Memory-efficient processing <bcp14>SHOULD</bcp14> be used for multi-gigabyte files</t>
          </li>
          <li>
            <t>ZIP64 format <bcp14>SHOULD</bcp14> be used for bundles exceeding 4GB</t>
          </li>
        </ul>
        <t><strong>Unicode and Encoding:</strong></t>
        <ul spacing="normal">
          <li>
            <t>All JSON files <bcp14>MUST</bcp14> use UTF-8 encoding</t>
          </li>
          <li>
            <t>vCon UUIDs in filenames <bcp14>MUST</bcp14> use valid filesystem characters (UUIDs are safe)</t>
          </li>
          <li>
            <t>Content_hash values use base64url encoding (filesystem-safe)</t>
          </li>
          <li>
            <t>File extensions <bcp14>MUST</bcp14> handle Unicode characters properly</t>
          </li>
        </ul>
        <t><strong>Incomplete Dialog Types:</strong></t>
        <ul spacing="normal">
          <li>
            <t>Dialog entries with type "incomplete" or "transfer" have no media files (per vCon spec)</t>
          </li>
          <li>
            <t>These do not contribute files to the bundle</t>
          </li>
          <li>
            <t>Bundle remains valid with dialog entries that have no corresponding files</t>
          </li>
        </ul>
        <t><strong>Inline Content:</strong></t>
        <ul spacing="normal">
          <li>
            <t>vCon objects with inline content (body/encoding) instead of external references (url/content_hash)</t>
          </li>
          <li>
            <t>No files added to <tt>files/</tt> directory for inline content</t>
          </li>
          <li>
            <t>Content remains embedded in the vCon JSON</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="migration">
      <name>Migration from Legacy Formats</name>
      <t>If a previous legacy format existed with per-vCon metadata folders:</t>
      <t><strong>Legacy Structure (hypothetical):</strong></t>
      <figure anchor="legacy-structure">
        <name>Hypothetical Legacy Bundle Structure</name>
        <artwork><![CDATA[
bundle.vconz
├── vcon.json
├── dialog/
├── attachments/
├── analysis/
└── metadata/
    ├── manifest.json
    ├── bundle-info.json
    └── relationships.json
]]></artwork>
      </figure>
      <t><strong>Migration to Version 1.0:</strong></t>
      <ol spacing="normal" type="1"><li>
          <t>Move <tt>vcon.json</tt> to <tt>vcons/[uuid].json</tt></t>
        </li>
        <li>
          <t>Move all files from <tt>dialog/</tt>, <tt>attachments/</tt>, <tt>analysis/</tt> to flat <tt>files/</tt> directory</t>
        </li>
        <li>
          <t>Remove <tt>metadata/</tt> folder (information redundant with vCon JSON)</t>
        </li>
        <li>
          <t>Create minimal <tt>manifest.json</tt> with version 1.0</t>
        </li>
        <li>
          <t>For multi-vCon migration, repeat for each vCon and deduplicate files by hash</t>
        </li>
      </ol>
    </section>
  </middle>
  <back>
    <references anchor="sec-normative-references">
      <name>Normative References</name>
      <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
        <front>
          <title>Key words for use in RFCs to Indicate Requirement Levels</title>
          <author fullname="S. Bradner" initials="S." surname="Bradner"/>
          <date month="March" year="1997"/>
          <abstract>
            <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
          </abstract>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="2119"/>
        <seriesInfo name="DOI" value="10.17487/RFC2119"/>
      </reference>
      <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8174" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml">
        <front>
          <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
          <author fullname="B. Leiba" initials="B." surname="Leiba"/>
          <date month="May" year="2017"/>
          <abstract>
            <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
          </abstract>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="8174"/>
        <seriesInfo name="DOI" value="10.17487/RFC8174"/>
      </reference>
      <reference anchor="I-D.ietf-vcon-vcon-core" target="https://datatracker.ietf.org/doc/html/draft-ietf-vcon-vcon-core-01" xml:base="https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.ietf-vcon-vcon-core.xml">
        <front>
          <title>The JSON format for vCon - Conversation Data Container</title>
          <author fullname="Daniel Petrie" initials="D." surname="Petrie">
            <organization>SIPez LLC</organization>
          </author>
          <date day="15" month="October" year="2025"/>
          <abstract>
            <t>vCon is a standardized framework for the exchange of conversational data. Conversations, which may involve one or more participants, occur across a wide variety of modes and application platforms. This document defines a JSON format for representing conversational data, encompassing metadata, conversation media, related documents, and analysis. The goal of this standard is to provide an abstracted, platform-independent data format for conversations, regardless of the mode or application platform. By doing so, it facilitates the integration and seamless exchange of conversational data across application platforms, enterprises, and trust boundaries.</t>
          </abstract>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-ietf-vcon-vcon-core-01"/>
      </reference>
    </references>
    <?line 820?>

<section anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The author would like to thank the vCon working group for their contributions and feedback on this specification. Special thanks to Thomas McCarthy-Howe for his work on the core vCon specification, which this bundle format builds upon.</t>
    </section>
    <section anchor="changelog">
      <name>Change Log</name>
      <section anchor="draft-miller-vcon-zip-bundle-00">
        <name>draft-miller-vcon-zip-bundle-00</name>
        <ul spacing="normal">
          <li>
            <t>Initial version defining vCon Zip Bundle format in kramdown-rfc</t>
          </li>
          <li>
            <t>Multi-vCon support with automatic deduplication</t>
          </li>
          <li>
            <t>Simplified flat file structure with hash-based naming</t>
          </li>
          <li>
            <t>Support for all vCon security forms (unsigned, signed, encrypted)</t>
          </li>
          <li>
            <t>Complete IANA media type registration</t>
          </li>
          <li>
            <t>Comprehensive security considerations</t>
          </li>
          <li>
            <t>Implementation guidelines and examples</t>
          </li>
        </ul>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
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

-->

</rfc>
