For the complete documentation index, see llms.txt. This page is also available as Markdown.

βœ…Spec Compliance Checklist

The must/never list for every adapter PR. Mirrors the smoke tests in vcon-adapter-template.

This is the gate every adapter PR (and every hand-written vCon construction) should pass. It mirrors the 14 smoke tests in vcon-adapter-template/tests/test_vcon_builder.py and the CONTRIBUTING.md in the same repo. If you scaffolded from the template, pytest runs all of this for you.

Spec target: IETF draft-ietf-vcon-vcon-core-02, syntax "0.4.0".

The one-line rule

Always use the vcon library helpers (add_party, add_dialog, add_attachment, add_analysis, add_tag). Never write directly to vcon_dict[...] except for the four documented quirks below.

Recent versions of the vcon Python library (β‰₯0.9.4) emit spec-correct output for every helper. Hand-rolling a dict bypasses that and is the single most common source of compliance drift in real adapters.

Top-level vCon

The template's new_vcon() helper handles all five of these β€” call it instead of Vcon.build_new() directly.

Analysis objects

See the Extensions Cookbook for full transcript examples.

Attachment objects

Tags

External media

The template provides sha512_b64url(data) and external_media_url(url, content, mediatype) helpers in vcon_builder.py.

Legacy field-name traps

These names appear in older vcon-mcp code and older draft revisions. Never emit them in a new vCon β€” the receiver may reject the vCon or, worse, silently misroute it.

❌ Never write
βœ… Always write
Why

appended

amended

Legacy vcon-mcp column name

must_support

critical

Legacy vcon-mcp column name

schema_version

schema

Older draft field name; current spec is schema

type (on attachments)

purpose

Core spec uses purpose; only lawful_basis extension uses type

did (on parties)

(removed)

The did field was removed in 0.4.0

The template's smoke test test_no_legacy_field_names_in_serialized_vcon greps the serialized vCon for appended and must_support and fails the build if either appears.

Extensions

The lawful_basis attachment is the single documented exception to the "use purpose on attachments" rule:

See the Extensions Cookbook and the Lawful Basis page for full examples.

Synthetic test data

If you're generating synthetic vCons for testing or training:

The 14 smoke tests, by name

These are the canonical compliance gates. From test_vcon_builder.py:

  1. test_syntax_is_0_4_0

  2. test_build_new_strips_group_and_redacted

  3. test_subject_is_written_via_vcon_dict

  4. test_extensions_listed_at_top_level

  5. test_lib_add_attachment_uses_purpose_with_party_and_dialog

  6. test_lib_add_analysis_uses_schema_not_schema_version

  7. test_lib_add_analysis_requires_vendor

  8. test_lib_add_tag_writes_party_and_dialog

  9. test_content_hash_format

  10. test_external_media_dialog_has_url_and_content_hash

  11. test_no_legacy_field_names_in_serialized_vcon[appended]

  12. test_no_legacy_field_names_in_serialized_vcon[must_support]

  13. (Plus delivery-layer tests for HMAC signature format and DLQ behavior)

Run them with pytest from any adapter scaffolded from the template. If you're not using the template, copy the test file β€” it's spec-version-pinned and short.

When you discover compliance drift

If you find a vCon in the wild β€” your archive, a partner's payload, a test fixture β€” that violates this list, do not round-trip it through Vcon.from_dict(...) and pretend it's fine. Open an issue against the producing adapter, file the offending field, and either:

  • Add a migration link in your conserver to repair the shape, OR

  • Reject the vCon at ingress

The spec is what the spec says. Tolerating drift is how the ecosystem fragments.

Last updated

Was this helpful?