{"schema_version":"1","site":"https://decosa.ai","id":"record","num":"07","name":"Tamper-evident record","tool_name":"Make a tamper-evident meeting record","short":"Record","blurb":"Live captions now. Afterwards, a transcript with speakers and a cited summary, sealed in a signed record that anyone can re-check.","status":"live","labels":{"industry":["public-sector","compliance-trust"],"job":["transcribe","attest"],"input":["voice"],"deploy":["hosted","selfhost"],"status":"live","output":["record","text"],"data":["pii"],"hardware":"gpu-96","licence":"permissive"},"industries":["public-sector","compliance-trust"],"runs_in":["hosted","selfhost"],"part_of":[],"built_from":["live-asr","diarize","grounding","signed-record"],"models":"Voxtral 4B · MOSS-TD 0.9B · Qwen3.8-27B","where":"Hosted for public meetings, self-host for investigations","hardware":"1× RTX PRO 6000 (96 GB), or 2× RTX 5090","final_artifact":"A signed session record: every caption, transcript line, summary sentence and model receipt in one hash chain.","self_host_first":false,"verification":{"receipt_coverage":"full","summary":"Signed hash chain over every line","manual_qa":{"hosted":{"date":"2026-09-25","result":"pass","p50_ms":16600,"p95_ms":null,"runs":null,"receipts_per_run":54,"cost_per_run_usd":0.0085},"selfhost":{"date":"2026-09-25","result":"pass","method":"fresh clone, api image built, the prompt's .env and compose used as written, sample against local model servers","notes":"The step 6 smoke passed as written: the record verified (132 entries), and after one edited word verification failed at the first edited transcript line. With the diarize service the record also carried speaker labels. Verified on 2026-09-25: images build, services start, sample passes end to end against local model servers equivalent to the documented ones; model-server startup itself not re-verified."},"known_limits":["Proves the record was not changed after signing and which key signed it; it does not prove the speech was recognised correctly. Not a certified court record.","Speaker labels need the diarize service; without it transcript lines have no speaker names."],"nightly_covers":null},"nightly":"https://api.decosa.ai/verify/status"},"eval_summary":{"metrics":[{"name":"Claim check on the synthetic sessions: sentences supported","value":"14/17 council, 9/9 interview","unit":null,"n":26,"split":"synthetic","note":"Re-run 26 Sep 2026 after the sessions were re-voiced with Decosa house voices (Kokoro-82M). 2 of the 3 council flags come from one summary sentence split at \"Mr.\"; the first build (macOS voices): 19/19 and 9/9."},{"name":"Speaker attribution on the synthetic council meeting (5 TTS voices)","value":"5 speakers found; one short turn given to the wrong member","unit":null,"n":5,"split":"synthetic","note":"Re-voiced 26 Sep 2026 with Decosa house voices (Kokoro-82M) and re-run; the first build (macOS voices): 4 speakers found, two male voices merged."}],"dataset":"Two synthetic TTS sessions (a council meeting and an interview) replayed through the live stack on a decosa-api test instance, one session at a time, gateway route.","held_out":false,"caveats":["WER on meeting or interview audio not measured yet; the ASR numbers published elsewhere are on clinical consultations (PriMock57).","Summary quality on meetings not measured yet.","Verifier recall on meeting minutes not measured yet.","Two synthetic sessions only."],"date":"2026-09-23","doc_url":null},"stack":{"summary":"For public meetings, internal investigations, arbitration and newsroom interviews. Captions stream while people speak. When the session ends, an open diarization model writes who said what, the language model writes a summary where every sentence cites transcript lines, and a verifier checks each sentence. Every caption, line, sentence, model receipt and audio-segment hash goes into one hash chain that the server signs. Change one word and verification fails, naming the entry. Public meetings can use the hosted API; investigations, newsrooms and research should self-host, and the box signs records with its own key.","tagline":"Live captions now; afterwards a speaker transcript and a cited summary, sealed in a signed record anyone can re-check.","deployment":"hosted-or-self-host","regulatory_note":"Not a certified court record: official transcripts need a certified reporter. Get consent before recording where the law requires it. Receipts attest that the record was not changed after signing; they do not prove that speech was recognised correctly. Captions for ADA Title II web content need accuracy checks; WER on meeting audio is not measured yet.","components":[{"id":"asr-live","role":"Live captions (streaming, no speakers)","name":"Voxtral Mini 4B Realtime","hf_repo":"mistralai/Voxtral-Mini-4B-Realtime-2602","license":"Apache-2.0","params":"4.4B","quant":"BF16","vram_gb":24,"memory_gb_estimate":null,"engine":"vLLM realtime WebSocket (/v1/realtime)","receipt_coverage":"partial","in_hosted_demo":true,"tiers":["all"],"alternative_to":null},{"id":"asr-pass2","role":"After the session: speaker-attributed transcript, one line per turn","name":"MOSS-Transcribe-Diarize 0.9B","hf_repo":"OpenMOSS-Team/MOSS-Transcribe-Diarize","license":"Apache-2.0","params":"0.9B","quant":"BF16","vram_gb":null,"memory_gb_estimate":null,"engine":"transformers (trust_remote_code) + moss_transcribe_diarize package; hosted: decosa-diarize service, 127.0.0.1:8092, GPU0","receipt_coverage":"partial","in_hosted_demo":true,"tiers":["standard","best"],"alternative_to":null},{"id":"llm","role":"Actions lane, speaker roles, cited summary, claim verifier","name":"Qwen3.8-27B (NVIDIA NVFP4)","hf_repo":"nvidia/Qwen3.8-27B-NVFP4","license":"Apache-2.0","params":"27.8B","quant":"NVFP4 (MLP) + FP8 (attention/GDN), FP8 KV cache, MTP speculative decoding k=3","vram_gb":57,"memory_gb_estimate":null,"engine":"vLLM 0.29.0","receipt_coverage":"strong","in_hosted_demo":true,"tiers":["standard","best"],"alternative_to":null},{"id":"llm-lite","role":"Lite tier: actions lane and a cited summary written from the live captions","name":"Qwen3.8-27B (official FP8)","hf_repo":"Qwen/Qwen3.8-27B-FP8","license":"Apache-2.0","params":"27.8B","quant":"FP8","vram_gb":null,"memory_gb_estimate":null,"engine":"vLLM 0.29.0 (same decosa-llm image)","receipt_coverage":"strong","in_hosted_demo":false,"tiers":["lite"],"alternative_to":null},{"id":"llm-best","role":"Best tier: summary writer and verifier","name":"DeepSeek-V4-Flash (NVIDIA NVFP4)","hf_repo":"nvidia/DeepSeek-V4-Flash-NVFP4","license":"MIT","params":"284B","quant":"NVFP4 experts + FP8 (about 159–176 GB of weights)","vram_gb":192,"memory_gb_estimate":null,"engine":"vLLM B12X community build, TP2 on 2× RTX PRO 6000, MTP draft fixed by the kit's patches","receipt_coverage":"none","in_hosted_demo":false,"tiers":["best"],"alternative_to":null}],"tiers":[{"id":"lite","label":"Lite · one 48 GB card, captions only","summary":"Captions, actions lane and a cited summary from the live captions, all chained and signed. No speaker labels.","components":["asr-live","llm-lite"],"hardware":"1x L40S or RTX 6000 Ada 48 GB (not measured)","quality_evidence":[{"metric":"WER on meeting audio","value":"not measured yet","source":null}],"latency_note":"not measured yet","in_hosted_demo":false,"receipt_coverage":"partial","receipt_note":"Direct route: every model call and caption is attested by the box's key; no gateway receipts.","hosting":null},{"id":"standard","label":"Standard · the hosted demo, two passes","summary":"Live captions, then speakers, roles, cited summary and claim check; the record embeds gateway-signed receipts for every model call.","components":["asr-live","asr-pass2","llm"],"hardware":"1x RTX PRO 6000 Blackwell 96 GB (hosted demo uses two cards on our server)","quality_evidence":[{"metric":"MOSS-TD WER / DER on PriMock57 (clinical proxy)","value":"10.3 / 11.4","source":"scribe-bench RESULTS.md"},{"metric":"claim check on the synthetic sessions: sentences supported","value":"19/19 and 9/9","source":"measured on our server 2026-09-23: a decosa-api pre-release test instance, scripts/replay_client.py, one session at a time, gateway route"},{"metric":"WER on meeting audio","value":"not measured yet","source":null}],"latency_note":"measured on our server: the signed record under a minute after a meeting ends, seconds after a short interview","in_hosted_demo":true,"receipt_coverage":"strong","receipt_note":"Language-model calls: gateway-signed receipts. Speech: attested receipts from decosa-api's key.","hosting":null},{"id":"best","label":"Best · DeepSeek-V4-Flash writes and checks","summary":"Standard plus a larger writer and verifier on two more 96 GB cards.","components":["asr-live","asr-pass2","llm-best"],"hardware":"2x RTX PRO 6000 96 GB for the writer plus the standard card","quality_evidence":[{"metric":"summary quality on meetings","value":"not measured yet","source":null}],"latency_note":"not measured yet","in_hosted_demo":false,"receipt_coverage":"partial","receipt_note":"Not a hosted model: model calls are attested by the box's key only.","hosting":null}],"alternates":[],"services":[{"name":"decosa-api","port":8445,"image":"${DECOSA_REGISTRY}/decosa-api:0.1.0","purpose":"Lane engine and HTTP/WS API (/ws/live, /demo/replay, /healthz). No GPU. Binds 127.0.0.1 by default."},{"name":"decosa-llm","port":8000,"image":"${DECOSA_REGISTRY}/decosa-llm:0.1.0","purpose":"vLLM OpenAI endpoint for Qwen3.8-27B, served as qwen3.8-27b. Internal to the compose network."},{"name":"decosa-asr","port":8000,"image":"${DECOSA_REGISTRY}/decosa-asr:0.1.0","purpose":"vLLM realtime endpoint for Voxtral Mini 4B Realtime (served as voxtral-realtime). Internal to the compose network."},{"name":"decosa-diarize","port":8092,"image":null,"purpose":"MOSS-Transcribe-Diarize 0.9B pass-2 service (decosa-api services/diarize, GPU0, loopback only). decosa-api runs pass 2 on stop: diarize, role map, cited note, verifier. No published image yet; self-host builds it (see the assemble prompt)."}],"tools":[{"name":"WebCrypto Ed25519 and SHA-256","url":"https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/verify","license":"browser built-in","purpose":"Verify a record in the browser without calling any server."},{"name":"cryptography (Python)","url":"https://cryptography.io/","license":"Apache-2.0 OR BSD-3-Clause","purpose":"decosa-api Ed25519 signing of receipts, checkpoints and records."}],"hardware":[{"tier":"1x RTX PRO 6000 Blackwell 96 GB","fits":true,"notes":"Hosted demo layout on our server: Voxtral and MOSS-TD on GPU0, Qwen3.8-27B on GPU1 (two cards). The one-card compose split is not measured."},{"tier":"1x L40S / RTX 6000 Ada 48 GB, lite tier","fits":null,"notes":"Not measured. FP8 LLM plus Voxtral; no diarizer, so the record uses the live captions as transcript lines."},{"tier":"2x RTX PRO 6000 96 GB + a card for the live pass, best tier","fits":null,"notes":"DeepSeek-V4-Flash ran on our server across two cards (TP2); the full record stack on it is not measured."}],"latency":[{"lane":"first caption","typical_ms":1400,"source":"measured on our server 2026-09-23: a decosa-api pre-release test instance, scripts/replay_client.py, one session at a time, gateway route"},{"lane":"actions (median per update)","typical_ms":2000,"source":"measured on our server 2026-09-23: a decosa-api pre-release test instance, scripts/replay_client.py, one session at a time, gateway route (1.2-2.0 s)"},{"lane":"signed record after audio ends, 91.7 s meeting","typical_ms":35000,"source":"measured on our server 2026-09-23: a decosa-api pre-release test instance, scripts/replay_client.py, one session at a time, gateway route (32.4-38.9 s over two runs: diarize 6-10, roles 1, summary 4, verifier 14-25)"},{"lane":"signed record after audio ends, 58.8 s interview","typical_ms":11200,"source":"measured on our server 2026-09-23: a decosa-api pre-release test instance, scripts/replay_client.py, one session at a time, gateway route"},{"lane":"verify in the browser (131-entry record)","typical_ms":null,"source":"not measured yet"}],"benchmark":null,"notes":[]},"buyer_facts":[{"label":"Measured latency","value":"Hosted p50 below is the time from the end of the audio to the final `done`, over 3 replays of the sample (2026-09-25, gateway route, one session at a time)."},{"label":"Typical run cost","value":"About a cent for the council sample: a couple of dozen model calls at the gateway list price, plus caption receipts signed by the server's key at no model cost."},{"label":"Data retention","value":"The signed record is returned to you in done; the server keeps receipts (hashes), not the transcript."},{"label":"What leaves the box (self-host)","value":"Nothing, with DECOSA_LLM_ROUTE=direct. Anyone can verify a record offline or with POST /record/verify."}],"data_handling":{"page":"/data#record","self_host":{"level":"confidential","leaves":"nothing","summary":"Runs on your machine; nothing is sent to Decosa or a third party by default."},"hosted":{"level":"operator-processed","demo_only":false,"summary":"TLS to Decosa's server, then decrypted and processed by Decosa's API server, with the open models run by NEAR AI through OpenRouter, with Reka AI as the only fallback under Decosa's account.","gpus":"operator-contracted","third_parties":[],"retention":"The signed record is returned to you in done; the server keeps receipts (hashes), not the transcript.","used_for_training":false,"encrypted_while_processed":false},"sealed_tier":{"applies":false,"note":"The sealed tier (raw chat only, never use-case pipelines) is paused at launch (/docs/sealed-tier)."},"external_calls":[]},"console":{"href":"/tools/developer/record","input":"mic","lanes":[{"id":"actions","title":"Motions, votes and actions","kind":"list"},{"id":"chain","title":"Record chain","kind":"markdown"},{"id":"final_transcript","title":"Transcript (speakers)","kind":"markdown"},{"id":"summary","title":"Summary (cited)","kind":"markdown"},{"id":"verifier","title":"Claim check","kind":"markdown"},{"id":"record","title":"Signed record","kind":"markdown"}],"samples":[{"n":1,"id":"record-council-meeting","title":"Town council meeting (synthetic)","deep_link":"/tools/developer/record?sample=1&autorun=0"},{"n":2,"id":"record-investigation-interview","title":"Workplace investigation interview (synthetic)","deep_link":"/tools/developer/record?sample=2&autorun=0"}],"deep_link_params":{"sample":"1-based index into samples, or a sample id","autorun":"1 = start the run once the sample is loaded; 0 (default) = only preselect","reduce-motion":"1 = turn off animations"}},"api":{"base":"https://api.decosa.ai","contract":"/api/contract.json","contract_markdown":"/api/contract.md","reference":"/docs/api","keys":"/account/keys"},"prompts":{"hosted":"/prompts/record-hosted.md","selfhost":"/prompts/record-selfhost.md","assemble":"/prompts/record-assemble.md","mac":"/prompts/record-mac.md"},"rehearsal":{"bundle":"/samples/record.zip","bundle_url":"https://decosa.ai/samples/record.zip","folder":"/samples/record/","expected":"/samples/record/expected.json","files":["/samples/record/expected.json","/samples/record/inputs/council-meeting-30s.wav","/samples/record/inputs/council-meeting-script.json"],"bytes":645273,"checks":["the session ends with a done event","the session reports no errors","final captions arrive","the captions carry the roll call of the town council","the server's own check of the sealed record passes","the signed record verifies","a record with one caption edited no longer verifies","the verifier names the first bad entry","every speech and model call has a signed receipt"],"licence":"Synthetic: a script written for Decosa (fictional town and people) read by Decosa house voices (Kokoro-82M stock voicepacks, Apache-2.0), each allowed by the consent ledger for project decosa-record-demo. Part of decosa-api, AGPL-3.0-or-later.","about":"The first 30 seconds of a synthetic town council meeting, streamed from a WAV file over the live WebSocket as if it came from a microphone. The session must produce captions and end in a signed, hash-chained record that verifies, and one edited caption must be caught.","run":{"containers":"docker compose exec api python scripts/rehearse.py record","checkout":"python scripts/rehearse.py record --bundle record.zip --base-url http://127.0.0.1:8445","mac":".venv/bin/python scripts/rehearse.py record"},"guidance":"Set up with a coding agent (we recommend Claude Code with Claude Opus 5.5; any capable coding agent works) on mock data only, run the rehearsal until every check passes, then run your own data locally yourself. Never give the agent real data during setup."},"hardware_fit":{"check":"/self-host/hardware?use=record","data":"/api/hardware.json","tiers":[{"id":"lite","gpu_gb":57.6,"basis":"stack","unknown":[]},{"id":"standard","gpu_gb":85.6,"basis":"estimate","unknown":[]},{"id":"best","gpu_gb":220,"basis":"estimate","unknown":[]}],"mac":{"fit":"full","memory_gb":48}},"links":{"page":"/tools/developer/record","json":"/use-cases/record.json","metrics":"/metrics/record","console":"/tools/developer/record","console_sample":"/tools/developer/record?sample=1&autorun=0","stack":"/tools/developer/record#stack","try_live":"/tools/developer/record","watch":"/tools/developer/record","build":"/tools/developer/record#build","self_host":"/tools/developer/record#self-host","prompts":{"hosted":"/prompts/record-hosted.md","selfhost":"/prompts/record-selfhost.md","assemble":"/prompts/record-assemble.md","mac":"/prompts/record-mac.md"}}}