{
  "contractVersion": "1",
  "recordType": "openai_speech_request_contract",
  "attemptId": "openai-voice-attempt-1",
  "request": {
    "model": "gpt-4o-mini-tts-2025-12-15",
    "voice": "marin",
    "input": "A vehicle quote rarely arrives as one complete set of terms. TermsTrail turns the fragments into an evidence-linked trail so a buyer can see what is written, what is missing, and what changed.\n\nThis sample is entirely fictional and needs no login, upload, API key, or live call. Sources are on the left, the evidence trail is in the center, and the current state is on the right.\n\nDeterministic TypeScript—not the model—calculates thirty-two thousand four hundred ninety dollars from the listed items. The worksheet states thirty-four thousand seven hundred ten, leaving two thousand two hundred twenty dollars unexplained. Evidence Coverage is eighty-two percent, with three unresolved conditions, so the result is Review required.\n\nEvery positive material finding follows back to an exact source excerpt. Missing information is different: TermsTrail shows the payment claim that triggered the APR check, but it does not fabricate evidence for an APR that is absent.\n\nThe next questions are assembled from unresolved finding IDs. The buyer can copy the draft, but TermsTrail never sends it or acts on the buyer’s behalf.\n\nNow I’ll add the fixed fictional response. Only this new source is extracted; the earlier evidence remains intact. The response names the two-thousand-two-hundred-twenty-dollar difference as a service contract, makes one package removable, and changes the payment from five hundred ninety-nine to six hundred twenty-nine dollars.\n\nThe arithmetic now reconciles at thirty-four thousand seven hundred ten dollars and Evidence Coverage rises to ninety-three percent. But TermsTrail does not call the service contract acceptable. APR and service-contract optionality are still missing, so Review required remains. Resolved, new, changed, and still-unresolved findings make the revision auditable.\n\nThe evaluation is inspectable: twenty offline synthetic fixtures reach one hundred percent structured validity and arithmetic, with one deliberate miss still visible. Separately, a recorded GPT-five-point-six hero passed every source and arithmetic gate. The broader live suite stopped on the next normalization miss, so TermsTrail discloses that limit instead of overstating results.\n\nThe principle is simple: AI interprets. Code calculates. The buyer decides. TermsTrail helps you follow every number to its source.",
    "instructions": "Use a polished, warm, trustworthy product-demo voice. Speak clearly at a measured pace of roughly 115 words per minute. Keep the delivery confident but not promotional or dramatic. Read the text exactly as written and pause naturally between paragraphs.",
    "response_format": "wav",
    "speed": 0.9
  },
  "requestIntegrity": {
    "canonicalization": "Recursively sort object keys lexicographically, preserve array order, then serialize as compact UTF-8 JSON.",
    "requestBuilderOrderSha256": "70db2d32c64d50818187f966754d153a385993608dbe535172a38cd4dfa9ab39",
    "requestCanonicalSha256": "1dd06cc7bb0d1ef74048c9a04d595c8d90ec5772b0971e2f3e7ef76fbdd6fd2e",
    "inputCharacters": 2334,
    "inputSha256": "d8b9bd790fe48ef81f82a4e45f3d098ec5156472e33b5878cd78206722321bd8",
    "instructionsSha256": "0dbaccea18a025534e80341357695df1a2e9d515ac85c56ff9eda1a916d3cc11"
  },
  "transport": {
    "sdk": "openai",
    "maxRetries": 0,
    "timeoutMs": 120000,
    "apiRequests": 1
  },
  "sourceProvenance": {
    "narrationDocumentPath": "docs/VIDEO_SCRIPT.md",
    "narrationExtraction": "Join the narration column from the nine 0:00–3:00 table rows with two newline characters after trimming table cells and outer smart quotes.",
    "historicalRequestDocumentSha256": "e8605b3c6599557cf275528f03f6661d8692a8cf1bdd20d2a1dfef964bb406ad",
    "historicalRequestScriptPath": "scripts/render-openai-voice.ts",
    "historicalRequestScriptSha256": "09aa899136ea8a07d949220b7b8361b313ebba4c291de2c3392b6fa75854c900",
    "scopeNote": "The exact provider payload is preserved above and reconstructs from the current narration table. The complete historical document and script byte streams are represented by their recorded hashes, not claimed to be reconstructed from current files."
  },
  "responseEvidence": {
    "rawFormat": "wav",
    "rawResponseSha256": "df00ac3edabbd053be57df645754d9150ea37f5b6e383479d234db59e9f4559a",
    "rawDurationSeconds": 149.056,
    "targetDurationSeconds": 178,
    "localRecoveryApiRequests": 0,
    "localRecoveryReason": "streaming-wav-size-placeholder",
    "rawResponseStorage": "Ignored local file .termstrail/openai-marin-narration-raw.wav; its hash is linked here but the raw WAV is not committed."
  },
  "billing": {
    "priceDate": "2026-07-15",
    "textInputUsdPerMillionTokens": 0.6,
    "audioOutputUsdPerMillionTokens": 12,
    "providerUsageReturned": false,
    "exactCostAvailable": false,
    "authorizationCapUsd": 0.15
  },
  "safety": {
    "aiGenerated": true,
    "disclosureRequired": true,
    "secretsIncluded": false,
    "additionalProviderCallsRequiredForVerification": 0
  }
}
