Three-node workflow that makes a local file conversion verifiable. Convert a document in the browser, bind the conversion into a canonical receipt that ties the input digest to the converter identity, the parameters, and the output digest, then independently verify the receipt by recomputing its binding. Each stage produces a tamper-evident SHA-256 execution hash, and nothing leaves the browser.
markdown branch starts at the Markdown converter (ART-189). The tabular branch swaps in the Tabular Data Converter (ART-190) for CSV, JSON, and Markdown-table conversion. Both branches share the same receipt builder and verifier for stages 2 and 3.
{
"tool": "convert_markdown_document",
"arguments": {
"markdown": "# Report\n\nSee **results** in the [appendix](https://example.org).",
"options": { "heading_ids": true, "table_support": true }
}
}
{
"tool": "build_conversion_receipt",
"arguments": {
"input_sha256": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"output_sha256": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
"source_format": "markdown",
"target_format": "html",
"converter": { "name": "art-189-markdown-document-converter", "version": "1.0.0" },
"parameters": { "heading_ids": true, "table_support": true }
}
}
{
"tool": "verify_conversion_receipt",
"arguments": {
"receipt": { "...": "the receipt object returned by build_conversion_receipt" },
"recomputed_input_sha256": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"recomputed_output_sha256": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
}
}
Run the three tools in order. The converter digests feed the receipt builder, and the receipt feeds the verifier, so the verdict is fully reproducible by re-hashing the files.
// Step 1: convert the document locally (Markdown branch)
const step1 = await mcp.call("convert_markdown_document", {
markdown: "# Report\n\nSee **results** in the [appendix](https://example.org).",
options: { heading_ids: true, table_support: true }
});
// Step 2: bind the conversion edge into a receipt
const step2 = await mcp.call("build_conversion_receipt", {
input_sha256: step1.input_sha256,
output_sha256: step1.html_sha256,
source_format: "markdown",
target_format: "html",
converter: { name: "art-189-markdown-document-converter", version: "1.0.0" },
parameters: { heading_ids: true, table_support: true }
});
// Step 3: verify the receipt (final stage)
const step3 = await mcp.call("verify_conversion_receipt", {
receipt: step2.receipt,
recomputed_input_sha256: step1.input_sha256,
recomputed_output_sha256: step1.html_sha256
});
console.log("Verdict:", step3.verdict); // "valid"
console.log("Binding:", step2.receipt.binding_sha256);
| Chain slug | document-conversion-verification |
| Nodes | art-189 (or art-190) → art-191 → art-192 |
| Branches | markdown · tabular |
| Cluster | Client-Side Conversions |
| Standards | RFC 4180 · CommonMark / GFM · RFC 8785 (JCS) |
| Spec version | 0.6.0 |
| Terminal export | Policy Mandate JSON · W3C VC (§13.11) |
| Hash scheme | SHA-256 over JCS-canonical {policy_parameters, output_payload} |