{"schema_version":"1","site":"https://decosa.ai","id":"device-mdr-triage","num":"64","name":"Device complaint MDR triage","tool_name":"Triage a device complaint for MDR","short":"MDR triage","blurb":"For medical device regulatory and quality teams. Give it a complaint and the product's labeling. It answers the 21 CFR 803.50(a) questions one by one, each with the words from the complaint that decide it: death or serious injury, could the device have caused or contributed, a malfunction, likely to cause serious harm if it recurred. It suggests reportable, not reportable or needs investigation, and starts the 30-day or 5-work-day clock from the day any employee heard, which the complaint itself may name. It checks the complaint record against 820.35(a), drafts the 3500A event description with every sentence checked, and signs a triage record and the named person's decision. A trend view groups complaints by failure mode. A triage aid: a person decides.","status":"live","labels":{"industry":["healthcare","compliance-trust"],"job":["review","attest"],"input":["text"],"deploy":["selfhost"],"status":"live","output":["record","data"],"data":["phi"],"hardware":"gpu-96","licence":"permissive"},"industries":["healthcare","compliance-trust"],"runs_in":["selfhost"],"part_of":[],"built_from":["typed-judgment","grounding","signed-record"],"models":"Qwen3.8-27B (typed answers, the narrative and its grounding check); the decision rule, the clocks and the file check are plain code","where":"Self-host for real complaints (they can hold PHI); the hosted demo takes public MAUDE narratives and synthetic complaints only","hardware":"1× RTX PRO 6000 (96 GB) for Qwen3.8-27B; the clocks, the file check and the signed records run on CPU","final_artifact":"A suggestion with the reasoning chain and quotes, the clock with its rule, the complaint-record check, a grounded 3500A draft, a Markdown memo, and signed triage and decision records.","self_host_first":true,"verification":{"receipt_coverage":"full","summary":"Receipt per model call; every answer that settles anything has a quote found word for word in the complaint; narrative sentences grounded; signed triage and decision records","manual_qa":{"hosted":{"date":"2026-09-26","result":"pass","p50_ms":11900,"p95_ms":null,"runs":null,"receipts_per_run":5,"cost_per_run_usd":0.0019},"selfhost":{"date":"2026-09-26","result":"pass","method":"fresh clone of decosa-api into a clean directory on our server, api image built from docker/api/Dockerfile, compose api service with a named data volume, direct route, local signing; torn down after","notes":"The assembly prompt's smoke tests passed against the already-running local Qwen3.8-27B vLLM (network_mode host instead of the compose llm service): clocks 2026-10-02 and 2026-09-10; rep-told-earlier reportable, clock from 2026-09-02, due 2026-10-02, with a narrative in 4.2 s (10 attested receipts); cpap-lid-cosmetic not reportable; meter-reads-high needs investigation; triage and decision records verified; the rehearsal bundle passed 16/16. Model-server startup was not re-run."},"known_limits":["Hosted verification ran on the pre-release server (decosa-api the pre-release branch on our server, gateway route). The production API gets this vertical when the branch merges. p50 is the eval's test median without the narrative; receipts and cost are from the smoke run (5 calls).","False not-reportable rate 6 of 96 on the test set: it can clear a reportable complaint, so a qualified person reviews every suggestion.","Measured on public MAUDE narratives (filer labels) and synthetic complaints (one labeller's labels); not on real complaint files or with an RA specialist's labels.","US FDA rules only (21 CFR 803, 820.35). No event problem codes, eMDR filing, remedial-action decisions or EU MDR vigilance.","The trend grouping and the two-year presumption were checked on the 7-complaint demo trend only."],"nightly_covers":null},"nightly":"https://api.decosa.ai/verify/status"},"eval_summary":{"metrics":[{"name":"Reportable complaints called not reportable","value":"6 of 96 (6.3%)","unit":null,"n":96,"split":"test","note":"The risky direction. Wilson 95% interval 2.9% to 13.0%. MAUDE 5 of 60, synthetic 1 of 36; 2 clear errors, 4 conservative filings"},{"name":"Not-reportable complaints called reportable","value":"0 of 58","unit":null,"n":58,"split":"test","note":"Complaints written and labelled by a separate agent from written rules"},{"name":"Not-reportable complaints cleared","value":"53 of 58","unit":null,"n":58,"split":"test","note":"The other 5 went to needs investigation (3 were another maker's device with an injury)"},{"name":"MAUDE reported events called reportable","value":"43 of 60","unit":null,"n":60,"split":"test","note":"12 needs investigation, 5 not reportable; labels are the filers' decisions"},{"name":"Synthetic reportable complaints called reportable","value":"34 of 36","unit":null,"n":36,"split":"test","note":"1 needs investigation, 1 not reportable"},{"name":"Accuracy on decisive answers","value":"130 of 136 (95.6%)","unit":null,"n":136,"split":"test","note":"Reportable or not reportable answers only"},{"name":"Clock deadline right","value":"36 of 36","unit":null,"n":36,"split":"test","note":"Synthetic clock and positive cases; gold dates hand-computed and script-checked by the labeller. MAUDE date checks 60 of 60"},{"name":"Narrative sentences kept by the grounding check","value":"43 of 43","unit":null,"n":43,"split":"test","note":"12 reportable test complaints; the check's own verdicts, no separate reader"}],"dataset":"154 test and 34 dev complaints: public openFDA MAUDE event narratives from 2025 (CC0; shortened, maker names replaced; labelled reportable because they were reported) and synthetic complaints about fictional devices written and labelled by a separate agent from rules drawn from 21 CFR 803.","held_out":true,"caveats":["MAUDE labels are the filers' decisions, which lean towards reporting; some misses are conservative filings an RA specialist could have closed.","The synthetic labels are one labeller's (an agent working from written rules), not an RA specialist's; no real complaint files were used.","One prompt change was made on the dev set before the test run; the test set was run once. One test item hit a date-range bug, fixed and rerun on its own.","The narrative check was measured on 12 complaints with the check's own verdicts only; the trend grouping on the demo trend only.","US FDA rules only; latency depends on the shared gateway's load."],"date":"2026-09-26","doc_url":"https://decosa.ai/metrics/evals/device-mdr-triage"},"stack":{"summary":"For regulatory affairs and quality teams at medical device makers, and the services that handle complaints for them. Give it a complaint (narrative, dates, device) and the product's labeling. Qwen3.8-27B answers the 803.50(a) questions one at a time: the worst patient outcome, whether the device may have caused or contributed, whether it malfunctioned, and whether a recurrence would be likely to cause a death or serious injury. Every answer that settles anything needs a quote the code finds word for word, or it counts as unclear. A rule turns the answers into reportable, not reportable or needs investigation; not reportable needs evidence on every path, and a death or serious injury is never cleared by the tool. The clock is code: 30 calendar days, 5 work days (FDA's request or remedial action) or 10 work days for user facilities, starting on the day any employee heard, which the complaint itself may name. It checks the complaint record against 820.35(a), drafts the Form 3500A event description with every sentence grounded in the complaint, seals a signed triage record, and signs the named person's decision. A trend view groups complaints by failure mode and flags FDA's two-year presumption. A triage aid: a qualified person decides.","tagline":"A device complaint in; the 21 CFR 803.50 questions answered with quotes, the MDR clock from the right day, and a signed record of who decided.","deployment":"self-host-first","regulatory_note":"Rules read on 26 Sep 2026 from eCFR (title 21 current to 24 Sep 2026). Manufacturers report deaths, serious injuries and malfunctions likely to cause or contribute to one if they recurred no later than 30 calendar days after they become aware (21 CFR 803.50(a)); awareness is when any employee has the information (803.3(b)(2)); 5-work-day reports when a reportable event needs remedial action to prevent an unreasonable risk of substantial harm, or FDA asks in writing (803.53); work days exclude federal holidays (803.3(y)); supplemental reports within 30 calendar days of new information (803.56); importers 30 calendar days and user facilities 10 work days (803.10). A qualified person (physician, nurse, risk manager or biomedical engineer) may conclude an event is not reportable, and the MDR event file keeps that information and the deliberations (803.20(c)(2), 803.18). The Quality Management System Regulation took effect on 2 Feb 2026: part 820 incorporates ISO 13485:2016 by reference, 820.35(a) lists what a complaint record must hold, and FDA now inspects under compliance programme 7382.850 instead of QSIT (FDA QMSR page, content current 2 Feb 2026). The malfunction factors, the two-year presumption and the start of the remedial-action clock are from FDA's guidance Medical Device Reporting for Manufacturers (8 Nov 2016), which is not binding. Complaints can hold patient health information: run it on your own hardware; the hosted demo takes public MAUDE narratives and synthetic complaints only. A triage aid, not a reportability determination or legal advice; it never says a firm or file is compliant and files nothing with FDA.","components":[{"id":"llm","role":"Reads the complaint (dates an employee was told, the event date, the device problem), answers the 803.50(a) questions one at a time (outcome, caused or contributed, malfunction, likely if it recurred), drafts the 3500A event description, judges every narrative sentence (the grounding judge), and groups complaints by failure mode for the trend view","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"],"alternative_to":null},{"id":"llm-lite","role":"Lite tier: the same pipeline on a 48 GB card","name":"Gemma 4 26B A4B (instruction-tuned)","hf_repo":"google/gemma-4-26B-A4B-it","license":"Apache-2.0 (model card also links the Gemma 4 licence page)","params":"25.2B","quant":"BF16 weights; FP8 at load time (vLLM --quantization fp8) to fit a 48 GB card","vram_gb":null,"memory_gb_estimate":null,"engine":"vLLM 0.29.0 (Gemma4ForConditionalGeneration is in its model registry)","receipt_coverage":"none","in_hosted_demo":false,"tiers":["lite"],"alternative_to":null},{"id":"llm-best","role":"Best tier: a larger model for long, messy complaint files","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 2x RTX PRO 6000, MTP draft fixed by the kit's patches","receipt_coverage":"none","in_hosted_demo":false,"tiers":["best"],"alternative_to":null},{"id":"glm-wanted","role":"Second judge, from another family","name":"GLM-5.3-Flash","hf_repo":"zai-org/GLM-5.3-Flash","license":"MIT","params":"321B","quant":"NVFP4 on NVIDIA (nvidia/GLM-5.3-Flash-NVFP4, about 170-186 GB, unconfirmed); MLX 4-bit on a Mac (165 GB)","vram_gb":null,"memory_gb_estimate":170,"engine":"SGLang SM120 build, TP2 on 2x 96 GB (vLLM is broken on sm_120 for this model, and the SGLang build hung on our server), or mlx-lm on a Mac with 192 GB or more","receipt_coverage":"none","in_hosted_demo":false,"tiers":["wanted"],"alternative_to":null}],"tiers":[{"id":"lite","label":"Lite · one 48 GB card","summary":"The same pipeline on a smaller mixture-of-experts model. Faster and cheaper; accuracy on this task unknown.","components":["llm-lite"],"hardware":"1x L40S or RTX 6000 Ada 48 GB (not measured)","quality_evidence":[{"metric":"false not-reportable rate and clock accuracy","value":"not measured yet","source":null}],"latency_note":"not measured yet","in_hosted_demo":false,"receipt_coverage":"partial","receipt_note":"Direct route: calls are attested by the box's key; no gateway receipts.","hosting":null},{"id":"standard","label":"Standard · the hosted demo, one 96 GB card","summary":"Qwen3.8-27B answers the questions and drafts the narrative; the decision rule, the quote checks, the clocks and the file check are plain code. Every model call receipted.","components":["llm"],"hardware":"1x RTX PRO 6000 Blackwell 96 GB","quality_evidence":[{"metric":"test set (154 complaints, run once): false \"not reportable\"","value":"6 of 96 gold-reportable (6.3%); MAUDE 5 of 60, synthetic 1 of 36","source":"decosa-api docs/evals/device-mdr-triage.md, measured on our server 2026-09-26, gateway route; prompts frozen after one change on a 34-complaint dev set"},{"metric":"false \"reportable\" / not-reportable complaints cleared","value":"0 of 58 / 53 of 58 (5 went to needs investigation)","source":"decosa-api docs/evals/device-mdr-triage.md, measured on our server 2026-09-26; complaints written and labelled by a separate agent from written rules"},{"metric":"reportable caught (MAUDE / synthetic)","value":"43 of 60 / 34 of 36; the rest went to needs investigation except the 6 above","source":"decosa-api docs/evals/device-mdr-triage.md, measured on our server 2026-09-26"},{"metric":"clock deadline right","value":"36 of 36 synthetic cases (earlier employee awareness, FDA 5-day requests, remedial action, user facilities, holidays); 60 of 60 MAUDE date checks","source":"decosa-api docs/evals/device-mdr-triage.md, measured on our server 2026-09-26; gold dates hand-computed and script-checked by the labeller"},{"metric":"narrative sentences kept by the grounding check","value":"43 of 43 on 12 reportable test complaints (its own verdicts; no separate reader)","source":"decosa-api docs/evals/device-mdr-triage.md, measured on our server 2026-09-26"},{"metric":"real complaint files labelled by an RA specialist","value":"not measured yet","source":null}],"latency_note":"measured on our server: seconds per triage without the narrative, a few at a time on the shared gateway, up to a minute as the gateway's load changed with the narrative; seconds self-hosted on the direct route","in_hosted_demo":true,"receipt_coverage":"strong","receipt_note":"Hosted: gateway-signed receipt per model call. Self-hosted: attested by the box's key.","hosting":null},{"id":"best","label":"Best · DeepSeek-V4-Flash on two more cards","summary":"A larger model for long, messy complaint files.","components":["llm-best"],"hardware":"2x RTX PRO 6000 96 GB","quality_evidence":[{"metric":"false not-reportable rate and clock accuracy","value":"not measured yet","source":null}],"latency_note":"not measured yet","in_hosted_demo":false,"receipt_coverage":"partial","receipt_note":"Not a hosted model: calls are attested by the box's key only.","hosting":null},{"id":"wanted","label":"Wanted · two large judges from different families","summary":"DeepSeek-V4-Flash and GLM-5.3-Flash each read the file, and a finding stands when they agree; disagreements go to the reviewer. Patient complaints stay on your own hardware, never on community providers. Not served yet.","components":["llm-best","glm-wanted"],"hardware":"Your own hardware: 2x 96 GB cards for DeepSeek-V4-Flash plus 2x 96 GB for GLM-5.3-Flash, or one Mac Studio with 512 GB holding both 4-bit builds (156 + 165 GB, sizes from our Mac; not run together yet). Estimate.","quality_evidence":[{"metric":"false not-reportable rate and clock accuracy","value":"not measured yet","source":null}],"latency_note":"not measured yet","in_hosted_demo":false,"receipt_coverage":"none","receipt_note":"On your own hardware its calls are attested by the box's key only: not a hosted model there, so no gateway receipts. Never sent to community providers.","hosting":"own-hardware"}],"alternates":[],"services":[{"name":"decosa-api","port":8445,"image":"${DECOSA_REGISTRY}/decosa-api:0.1.0","purpose":"Intake, the codes, the deadline rules, the quote checks, the recommendation rule, grounding, signing and the HTTP API (/appeal/*). 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. Internal to the compose network."}],"tools":[{"name":"decosa typed-judgment (vertical 24)","url":"https://decosa.ai/apps/typed-judgment","license":"AGPL-3.0-or-later (decosa-api)","purpose":"Answer parsing and the stated-confidence probability for each 803.50(a) question."},{"name":"decosa grounding (vertical 17)","url":"https://decosa.ai/apps/grounding","license":"AGPL-3.0-or-later (decosa-api)","purpose":"Judges every 3500A narrative sentence against the complaint and cites the span; imported, not copied."},{"name":"claims dates module (vertical 54)","url":"https://decosa.ai/apps/claims-conduct-pack","license":"AGPL-3.0-or-later (decosa-api)","purpose":"Calendar days, work days and US federal holidays for the MDR clocks; imported."},{"name":"decosa record (vertical 07) and POST /record/verify","url":"https://decosa.ai/apps/record","license":"AGPL-3.0-or-later (decosa-api)","purpose":"The hash chain and the Ed25519-signed triage and decision records; anyone can re-check them."},{"name":"eCFR: 21 CFR 803 and 820","url":"https://www.ecfr.gov/current/title-21/part-803","license":"public law","purpose":"The reporting rules and the complaint-record items, quoted in /mdr/info with the date they were read."},{"name":"FDA guidance: Medical Device Reporting for Manufacturers (8 Nov 2016)","url":"https://www.fda.gov/media/86420/download","license":"US government work (public domain)","purpose":"The malfunction factors, the two-year presumption and the remedial-action clock start, cited as guidance."},{"name":"openFDA device adverse events (MAUDE)","url":"https://open.fda.gov/apis/device/event/","license":"CC0 1.0 (https://open.fda.gov/license/)","purpose":"Public event narratives for the demo and the eval (756 reports received in 2025)."}],"hardware":[{"tier":"1x RTX PRO 6000 Blackwell 96 GB","fits":true,"notes":"Measured: the hosted demo's Qwen3.8-27B runs on one of these cards on our server, and the self-host sandbox used the same server."},{"tier":"1x L40S / RTX 6000 Ada 48 GB","fits":null,"notes":"Not measured. FP8 Qwen3.8-27B with a shorter context, or Gemma 4 26B A4B (lite)."},{"tier":"CPU only","fits":true,"notes":"The clocks (POST /mdr/clock), the decision record, the signed records and verification need no GPU; reading the complaint needs the model."}],"latency":[{"lane":"one triage without the narrative, busy shared gateway","typical_ms":11900,"source":"decosa-api docs/evals/device-mdr-triage.md, test median on our server 2026-09-26 (90th percentile 30.7 s), gateway route, 3 at a time"},{"lane":"one triage with the narrative, self-hosted direct route","typical_ms":4200,"source":"measured on our server 2026-09-26, self-host sandbox, rep-told-earlier (10 model calls)"},{"lane":"clock rules only","typical_ms":50,"source":"estimate: no model call"}],"benchmark":{"title":"How often does it clear a complaint that should be reported?","intro":"154 complaints run once: 60 public MAUDE event narratives (reported to FDA, so labelled reportable by the filer's decision) and 94 synthetic complaints written and labelled by a separate agent from written rules, without seeing the prompts. Prompts were changed once on a 34-complaint dev set, then frozen.","rows":[{"label":"Reportable complaints called not reportable","value":"6 of 96","detail":"6.3%; 2 clear errors, 4 conservative MAUDE filings"},{"label":"Not-reportable complaints called reportable","value":"0 of 58","detail":"53 cleared, 5 sent to needs investigation"},{"label":"Clock deadlines right","value":"36 of 36","detail":"earlier employee awareness, 5-day and 10-work-day clocks, holidays"},{"label":"Cost per triage with the narrative","value":"about $0.004","detail":"11 model calls, 9,900 tokens on the catheter demo, gateway list price"}],"points":[{"heading":"Where it fails","text":"Judging whether a malfunction with no injury would be likely to cause serious harm if it recurred: it cleared an infusion pump whose anti-free-flow clamp failed with no harm. It also missed that a planned hip revision is surgery. Terse MAUDE narratives often go to needs investigation (12 of 60)."},{"heading":"What it does not show","text":"MAUDE labels are the filers' decisions, which lean towards reporting, and the synthetic labels are one labeller's, not an RA specialist's. Real complaint files are longer and messier. Measure it on your own closed complaints before relying on it."}],"source":"decosa-api docs/evals/device-mdr-triage.md, 26 Sep 2026"},"notes":[]},"buyer_facts":[{"label":"What it gives you","value":"The 803.50(a) questions answered with quotes, a suggestion (reportable, not reportable, needs investigation) with the reasoning, the clock with its CFR rule and arithmetic, the 820.35(a) complaint-record check and missing 3500A items, a grounded draft event description, a Markdown memo, a signed triage record and a signed decision record naming the decider."},{"label":"What it does not do","value":"It does not decide or file: no eMDR submission, no event problem codes, no remedial-action or recall decision (21 CFR 806), no EU MDR vigilance. It never says a firm or file is compliant. It reads the text you send; scanned forms need OCR first."},{"label":"Data retention","value":"Nothing kept on the server. Complaints and records live in memory for the request; logs carry counts and decisions only. You keep the signed records in the MDR event file."},{"label":"What leaves the box (hosted demo)","value":"The complaint and labeling go to Qwen3.8-27B through the Decosa API, whose receipts hold hashes, not text. Self-hosted, nothing leaves. The hosted demo is for public MAUDE narratives and synthetic complaints only."},{"label":"Model calls per triage","value":"One facts read and 2 to 4 questions; with the narrative, one draft and one grounding call per sentence: about 3 to 11 calls on the demo complaints."},{"label":"Typical run cost","value":"A fraction of a cent at the gateway list price for the catheter complaint with the narrative; less for a cosmetic complaint that does not look reportable. Each run shows its own measured cost."},{"label":"Clocks","value":"30 calendar days, 5 work days (FDA's written request, or remedial action from the day a supervisor knew), 10 work days for user facilities, and 30 days for supplements, from the day any employee had the information. Deadlines are not moved off weekends or holidays."}],"data_handling":{"page":"/data#device-mdr-triage","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":true,"summary":"Hosted demo on sample or public data only; self-host for real data.","gpus":"operator-contracted","third_parties":[],"retention":"Nothing kept on the server. Complaints and records live in memory for the request; logs carry counts and decisions only. You keep the signed records in the MDR event file.","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/life-sciences/device-mdr-triage","input":"mdr","lanes":[{"id":"questions","title":"The 803.50(a) questions","kind":"list"},{"id":"decision","title":"Suggestion","kind":"list"},{"id":"clock","title":"Clock","kind":"list"},{"id":"file","title":"Complaint record and 3500A","kind":"list"},{"id":"narrative","title":"Draft event description","kind":"markdown"},{"id":"record","title":"Signed records","kind":"json"},{"id":"trend","title":"Trend","kind":"list"}],"samples":[{"n":1,"id":"rep-told-earlier","title":"Rep told earlier","deep_link":"/tools/life-sciences/device-mdr-triage?sample=1&autorun=0"},{"n":2,"id":"maude-pod-infection","title":"Maude pod infection","deep_link":"/tools/life-sciences/device-mdr-triage?sample=2&autorun=0"},{"n":3,"id":"maude-meter-no-start","title":"Maude meter no start","deep_link":"/tools/life-sciences/device-mdr-triage?sample=3&autorun=0"},{"n":4,"id":"maude-pacemaker-header","title":"Maude pacemaker header","deep_link":"/tools/life-sciences/device-mdr-triage?sample=4&autorun=0"},{"n":5,"id":"cpap-lid-cosmetic","title":"Cpap lid cosmetic","deep_link":"/tools/life-sciences/device-mdr-triage?sample=5&autorun=0"},{"n":6,"id":"meter-reads-high","title":"Meter reads high","deep_link":"/tools/life-sciences/device-mdr-triage?sample=6&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/device-mdr-triage-hosted.md","selfhost":"/prompts/device-mdr-triage-selfhost.md","assemble":"/prompts/device-mdr-triage-assemble.md","mac":null},"rehearsal":{"bundle":"/samples/device-mdr-triage.zip","bundle_url":"https://decosa.ai/samples/device-mdr-triage.zip","folder":"/samples/device-mdr-triage/","expected":"/samples/device-mdr-triage/expected.json","files":["/samples/device-mdr-triage/expected.json","/samples/device-mdr-triage/inputs/cosmetic-complaint.json","/samples/device-mdr-triage/inputs/cosmetic-product.json","/samples/device-mdr-triage/inputs/reportable-complaint.json","/samples/device-mdr-triage/inputs/reportable-product.json","/samples/device-mdr-triage/inputs/trend-complaints.json"],"bytes":4622,"checks":["a 5-day report requested by FDA is due 5 work days after 2 Sep 2026, skipping Labor Day (no model)","the catheter complaint looks reportable","the outcome is a serious injury, with a quote from the complaint","the 30-day clock starts on 2 Sep, the day the sales rep was told, not the 14 Sep received date","and is due 2 Oct 2026","a draft event description is written, attributed to the report","the signed triage record verifies","a record whose suggestion was changed no longer verifies","the named decision is signed and verifies","the decision record names the decider","the cosmetic crack does not look reportable","and no narrative is drafted for it","the complaint record check finds the complainant's address missing","the occlusion-alarm complaints are grouped together","the malfunction-only complaint C-0719 is flagged to re-triage under the presumption","every model call has a signed receipt"],"licence":"Synthetic (CC0): the complaints, devices and companies are invented (decosa_api/verticals/mdr/data/samples.json). Part of decosa-api, AGPL-3.0-or-later.","about":"Two synthetic device complaints and a synthetic trend. The first: a PICC catheter tip separated on removal and the fragment was snared out in interventional radiology; the sales rep was told on 2 Sep 2026 and the complaint unit logged it on 14 Sep. The triage must say reportable (a serious injury: an intervention to prevent permanent damage), quote it, and start the 30-day clock on 2 Sep (due 2 Oct), not 14 Sep. A named person then signs the decision. The second: a hairline crack in a CPAP humidifier lid's cosmetic cover, device working, no injury: not reportable, and no narrative drafted. The trend: seven complaints about one fictional pump, four with an occlusion alarm that did not sound, one of them a serious injury; the malfunction-only ones of that mode are flagged to re-triage under FDA's two-year presumption. Both signed records verify, and fail once changed.","run":{"containers":"docker compose exec api python scripts/rehearse.py device-mdr-triage","checkout":"python scripts/rehearse.py device-mdr-triage --bundle device-mdr-triage.zip --base-url http://127.0.0.1:8445","mac":".venv/bin/python scripts/rehearse.py device-mdr-triage"},"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=device-mdr-triage","data":"/api/hardware.json","tiers":[{"id":"lite","gpu_gb":40,"basis":"estimate","unknown":[]},{"id":"standard","gpu_gb":57.6,"basis":"stack","unknown":[]},{"id":"best","gpu_gb":192,"basis":"stack","unknown":[]},{"id":"wanted","gpu_gb":384,"basis":"estimate","unknown":[]}],"mac":null},"links":{"page":"/tools/life-sciences/device-mdr-triage","json":"/use-cases/device-mdr-triage.json","metrics":"/metrics/device-mdr-triage","console":"/tools/life-sciences/device-mdr-triage","console_sample":"/tools/life-sciences/device-mdr-triage?sample=1&autorun=0","stack":"/tools/life-sciences/device-mdr-triage#stack","try_live":"/tools/life-sciences/device-mdr-triage","watch":"/tools/life-sciences/device-mdr-triage","build":"/tools/life-sciences/device-mdr-triage#build","self_host":"/tools/life-sciences/device-mdr-triage#self-host","prompts":{"hosted":"/prompts/device-mdr-triage-hosted.md","selfhost":"/prompts/device-mdr-triage-selfhost.md","assemble":"/prompts/device-mdr-triage-assemble.md","mac":null}}}