{"schema_version":"1","site":"https://decosa.ai","id":"sar-narrative-desk","num":"53","name":"SAR narrative desk","tool_name":"Write a SAR narrative","short":"SAR narratives","blurb":"Drafts a suspicious-activity narrative from an alert's case file (a transaction ledger, the customer profile and the investigator's notes) in the structure FinCEN asks for: who, what, when, where, why and how. Every sentence cites the rows, fields or notes it rests on. Every amount, date, count and total is recomputed in code from the cited rows, and a wrong one is held back with the right figure beside it. It also writes a signed no-file rationale for alerts closed without a SAR, or checks a draft you wrote. A drafting aid: an investigator decides and files.","status":"live","labels":{"industry":["finance","compliance-trust"],"job":["draft","review"],"input":["text"],"deploy":["selfhost"],"status":"live","output":["text","record"],"data":["confidential","pii"],"hardware":"gpu-96","licence":"permissive"},"industries":["finance","compliance-trust"],"runs_in":["selfhost"],"part_of":[],"built_from":["numeric-grounding","grounding","signed-record"],"models":"Qwen3.8-27B drafts and judges; the numbers and the red-flag screen are plain code","where":"Self-host for real cases (SAR confidentiality); the hosted demo takes synthetic case files only","hardware":"1× RTX PRO 6000 (96 GB) or 1× RTX 5090 (32 GB) for Qwen3.8-27B; the numeric check, the screen and the report run on CPU","final_artifact":"A filing copy of the narrative (no citations, held sentences left out), a cited workpaper in Markdown for the case file, and a signed JSON report.","self_host_first":true,"verification":{"receipt_coverage":"full","summary":"Receipt per model call; every number recomputed from the cited rows; signed report over hashes and verdicts","manual_qa":{"hosted":{"date":"2026-09-26","result":"pass","p50_ms":24700,"p95_ms":null,"runs":null,"receipts_per_run":30,"cost_per_run_usd":0.017},"selfhost":{"date":"2026-09-26","result":"pass","method":"fresh clone, compose up, sample against local model servers","notes":"A fresh clone of a decosa-api pre-release build (not yet merged to main), the api image built from it with DECOSA_SAR_SYNTHETIC_ONLY=0, run against the already-running local Qwen3.8-27B vLLM on the direct route. The planted-errors check held exactly the three planted sentences (1.7 s); the structuring draft ran in 7.9 s with 51 of 51 numbers traced; the report verified, a changed status failed, and receipts were attested. Model-server startup itself not re-verified."},"known_limits":["Synthetic only on the hosted demo. Every number here comes from our own synthetic generator; it has not been run on real case files.","A date is checked for membership in the cited rows, and tied to its amount when the sentence pairs them; a date moved onto another cited day with no amount beside it can pass. Counts can match another subset of the cited rows.","The screen's thresholds are ours. It flagged structuring on 5 of 40 clean cash-business cases.","It checks that what is written is traced to the case file, not that nothing is missing, and it sees nothing outside the case file (watch lists, other institutions, prior SARs).","The ledger must be CSV; PDF statements are not read."],"nightly_covers":null},"nightly":"https://api.decosa.ai/verify/status"},"eval_summary":{"metrics":[{"name":"Planted wrong numbers caught in reference narratives, first run (no model)","value":"1,598 of 1,600 (99.9%)","unit":null,"n":1600,"split":"test","note":"1,600 of 1,600 after a fix made on seeing the two misses; 0 of 1,920 correct numbers flagged."},{"name":"Wrong numbers planted in the model's own sentences caught (v3)","value":"340 of 356 (95.5%)","unit":null,"n":356,"split":"test","note":"Amounts 133/133, dates 165/174, counts 34/40."},{"name":"Invented sentences held in investigator drafts","value":"18 of 20","unit":null,"n":20,"split":"test","note":"The other two were flagged (partial), so all 20 were caught. Re-run 28 Sep 2026 on the same weights (direct route) after the judge was given the institution-conclusions and place-name context; the same day before that change: 19 held, 1 flagged; 26 Sep (gateway): 19 held, 1 flagged."},{"name":"True reference sentences held / flagged","value":"0 of 172 held; 19 of 172 (11%) flagged","unit":null,"n":172,"split":"test","note":"28 Sep 2026 re-run (direct route, same weights). Before the change, same day: 0 held, 27 flagged. 26 Sep (gateway): 1 held, 32 flagged."},{"name":"Numbers the model wrote that the checker flagged (v3 drafts)","value":"0 of 533","unit":null,"n":533,"split":"test","note":"4 of 299 sentences held, one of them a false hold by the judge."},{"name":"Invented facts in randomly sampled checked sentences (manual read, v2)","value":"0 of 70; 2 of 70 (3%) minor unsupported details passed","unit":null,"n":70,"split":"dev","note":"Read by the building agent only; v2 is partly development data."}],"dataset":"Synthetic case files from the vertical's own generator (fictional people, accounts and bank). Seeds 1-20 used for building, 1000+ for the eval: 200 cases for the numeric check, three draft sets of 15 runs (v1, v2, v3; code changed after v1 and v2, v3 run after the last checker change), 20 reference narratives with one invented sentence each.","held_out":true,"caveats":["Everything is synthetic, written by the same agent that wrote the checker and the prompts: evidence the mechanisms work on this generator, not accuracy on real bank data.","Hallucinations were judged by the building agent reading the sentences; no second reader.","Code was changed after v1 and v2, so those sets are partly development data; two small fixes after v3 are not re-measured.","Comparator claims and percentages are not planted in the numeric check, and reference narratives are template prose.","The screen's thresholds were set on this generator; 5 of 40 clean cases were flagged for structuring."],"date":"2026-09-26","doc_url":"https://decosa.ai/metrics/evals/sar-narrative-desk"},"stack":{"summary":"For BSA/AML investigators. Send an alert's case file: the transactions as CSV, the customer profile and alert fields, and your notes. A red-flag screen in code (structuring, rapid movement, funnel account, elder exploitation) computes the totals, counts and date ranges with the rows behind them. Qwen3.8-27B drafts each section of the narrative in FinCEN's structure (introduction; who, what, when, where, why, how; conclusion), citing a row, field, note or computed fact for every sentence. Then each sentence is checked: its citations must exist; every amount, date, count, span and percentage is recomputed in code from the cited rows by the numeric grounding block; and the grounding judge reads it against only what it cites. A sentence that fails is held back from the filing copy, with the figure the rows do support. It also drafts a short no-file rationale for an alert closed without a SAR, or checks a narrative you wrote. You get a filing copy without citations, a cited workpaper for the case file, and a signed report. A drafting aid: an investigator decides and files.","tagline":"A suspicious-activity narrative drafted from the case file, with every sentence citing its rows and every number recomputed in code.","deployment":"self-host-first","regulatory_note":"Checked 26 Sep 2026 against primary sources (links under Tools). SAR information is confidential: 31 U.S.C. 5318(g)(2) bars notifying anyone involved that a transaction was reported, and 31 CFR 1020.320(e) makes a SAR, and anything that would reveal one, confidential. So this is self-host first, and the hosted demo refuses any case file not marked synthetic. The draft follows FinCEN's Guidance on Preparing a Complete & Sufficient SAR Narrative (November 2003: the five W's plus how; introduction, body, conclusion; chronological; individual dates and amounts, not only totals; no tables or 'see attached') and the FinCEN SAR Filing Instructions (version 1.0, April 2026, Part V: do not file supporting documentation with the SAR), which is why the filing copy drops the citations and the cited workpaper stays in the case file (31 CFR 1020.320(d): keep supporting documentation five years). A bank files within 30 calendar days of initial detection, up to 60 if no suspect is identified (31 CFR 1020.320(b)(3)). The no-file rationale is optional: FinCEN's SAR FAQs of 9 October 2025 (Q4) say there is no requirement to document a decision not to file, FinCEN encourages it, and a short statement will usually suffice. Typologies follow FinCEN Advisories FIN-2014-A005 (funnel accounts, 28 May 2014) and FIN-2022-A002 (elder financial exploitation, 15 June 2022: an older adult is 60 or over); structuring follows 31 CFR 1010.100(xx) and FAQ Q1 (amounts near $10,000 alone do not require a SAR). The rapid-movement red flag cites the FFIEC BSA/AML manual appendix, which we could not re-fetch (unverified). The screen's thresholds are our own, not regulatory. This is not legal advice and never a compliance determination: the investigator decides whether to file, edits and files. Model licence: Apache-2.0 (Qwen3.8-27B).","components":[{"id":"desk","role":"Red-flag screen, citation check, numeric grounding, filing copy, workpaper and signed report (no model; CPU)","name":"decosa-api SAR desk (decosa_api/verticals/sar) with the numeric grounding block (decosa_api/verticals/numeric) and the grounding module (decosa_api/verticals/grounding)","hf_repo":null,"license":"AGPL-3.0-or-later","params":null,"quant":null,"vram_gb":0,"memory_gb_estimate":null,"engine":"Python 3.12; CSV ledger in integer cents; rule-based extraction of amounts, dates, counts, durations, percentages and account suffixes; sums, counts, min/max/mean, first and last dates, spans, distinct values and ratios over the cited rows","receipt_coverage":"partial","in_hosted_demo":null,"tiers":["lite","standard"],"alternative_to":null},{"id":"model","role":"Section drafting and the grounding judge","name":"Qwen3.8-27B (NVFP4)","hf_repo":"nvidia/Qwen3.8-27B-NVFP4","license":"Apache-2.0","params":"27.8B","quant":"NVFP4 (MLP NVFP4, GDN/attention FP8) + FP8 KV cache; MTP head, 3 draft tokens","vram_gb":20,"memory_gb_estimate":null,"engine":"vLLM 0.29.0, temperature 0, thinking off, prefix caching","receipt_coverage":"strong","in_hosted_demo":true,"tiers":["standard"],"alternative_to":null},{"id":"ocr","role":"Bank-statement and wire-confirmation reader (alternate)","name":"A licence-clean vision/OCR model (not chosen)","hf_repo":null,"license":"unknown","params":null,"quant":null,"vram_gb":null,"memory_gb_estimate":null,"engine":null,"receipt_coverage":"none","in_hosted_demo":false,"tiers":["alternates"],"alternative_to":null}],"tiers":[{"id":"lite","label":"Lite · numbers and citations only, no GPU","summary":"POST /sar/numbers checks a narrative you wrote with any tool: every citation must exist and every number must match or be computed from the cited rows. No drafting, no judge for the other facts.","components":["desk"],"hardware":"Any CPU","quality_evidence":[{"metric":"Correct numbers flagged, reference narratives (200 held-out synthetic cases)","value":"0 of 1,920","source":"docs/evals/sar-narrative-desk.md, part A, 26 Sep 2026"},{"metric":"Planted wrong numbers caught (amounts, dates, counts), reference narratives","value":"1,600 of 1,600 (1,598 before a bug fix)","source":"docs/evals/sar-narrative-desk.md, part A"},{"metric":"Planted wrong numbers caught in the model's own sentences","value":"340 of 356 (95.5%): amounts 133/133, dates 165/174, counts 34/40","source":"docs/evals/sar-narrative-desk.md, part D (v3)"}],"latency_note":"no model call; milliseconds on CPU (not separately timed)","in_hosted_demo":true,"receipt_coverage":"none","receipt_note":"No model call, so no receipts; the numeric check is deterministic code.","hosting":null},{"id":"standard","label":"Standard · one GPU for the model (hosted demo)","summary":"Qwen3.8-27B drafts each section and judges each sentence against what it cites; the screen and the numbers are code. This is what the hosted demo runs, on synthetic case files only.","components":["desk","model"],"hardware":"1x RTX PRO 6000 96 GB (measured) or 1x RTX 5090 32 GB (estimate)","quality_evidence":[{"metric":"Drafted sentences traced / flagged / held (v3: 15 synthetic cases, 299 sentences)","value":"272 / 23 / 4 (1 of the 4 a false hold)","source":"docs/evals/sar-narrative-desk.md, part B"},{"metric":"Numbers the model wrote that failed the check (v3)","value":"0 of 533","source":"docs/evals/sar-narrative-desk.md, part B"},{"metric":"Citation validity (v3)","value":"0 uncited sentences; 1 unknown id of 931","source":"docs/evals/sar-narrative-desk.md, part B"},{"metric":"Invented facts in investigator drafts held / flagged (20 drafts)","value":"18 / 2 (all 20 caught); 0 of 172 true sentences held, 19 flagged (28 Sep re-run)","source":"docs/evals/sar-narrative-desk.md, part C"},{"metric":"Typology coverage: planted typology found by the screen and named in the draft (12 cases, v3)","value":"12/12 and 12/12; none named that the screen did not find","source":"docs/evals/sar-narrative-desk.md, part B"},{"metric":"Hallucinated facts in traced sentences (manual read, 70 sampled)","value":"0 invented facts; 2 small unsupported details (a state, 'international')","source":"docs/evals/sar-narrative-desk.md, part E"}],"latency_note":"measured: under a minute per full draft through the shared gateway; seconds for a no-file rationale or a short check.","in_hosted_demo":true,"receipt_coverage":"strong","receipt_note":"Every model call is a separate gateway call with a gateway-signed receipt; the signed report lists them all.","hosting":null}],"alternates":[{"id":"ocr","label":"Statements as PDFs and scans","components":["ocr"],"hardware":"1x RTX PRO 6000 96 GB (estimate)","use":"Read the ledger from bank statements and wire confirmations instead of CSV, with each row tied to its page. The OCR model is not chosen yet; it must be licence-clean.","status":"not built"}],"services":[{"name":"decosa-api","port":8445,"image":"${DECOSA_REGISTRY}/decosa-api:<tag>","purpose":"GET /sar/info, /sar/samples; POST /sar/draft (SSE or JSON), /sar/numbers, /sar/verify. Keeps no case text."},{"name":"vLLM (model)","port":8114,"image":"vllm/vllm-openai@sha256:c2914767605584b6d8f45686b82de173ecc99e781897aa3d0a66dacd72c51ae1","purpose":"Qwen3.8-27B NVFP4 behind our gateway (hosted) or called directly (self-host)."}],"tools":[{"name":"FinCEN, Guidance on Preparing a Complete & Sufficient SAR Narrative (Nov 2003)","url":"https://www.fincen.gov/sites/default/files/shared/sarnarrcompletguidfinal_112003.pdf","license":"US government work (public domain)","purpose":"The section structure of the draft and the rule of individual dates and amounts."},{"name":"FinCEN SAR Filing Instructions, version 1.0 (April 2026)","url":"https://bsaefiling.fincen.gov/resources/FinCENSARFilingInstructions.pdf","license":"US government work (public domain)","purpose":"Part V narrative checklist; supporting documentation is kept, not filed."},{"name":"FinCEN and agencies, SAR FAQs (9 Oct 2025)","url":"https://www.fincen.gov/system/files/2025-10/SAR-FAQs-October-2025.pdf","license":"US government work (public domain)","purpose":"Q1 (structuring), Q4 (documenting a decision not to file is encouraged, not required)."},{"name":"31 U.S.C. 5318 (Cornell LII)","url":"https://www.law.cornell.edu/uscode/text/31/5318","license":"US statute (public domain)","purpose":"(g)(2): SAR confidentiality."},{"name":"31 CFR 1020.320 (eCFR)","url":"https://www.ecfr.gov/current/title-31/subtitle-B/chapter-X/part-1020/subpart-C/section-1020.320","license":"US regulation (public domain)","purpose":"(b)(3) filing deadline, (d) five-year retention, (e) confidentiality."},{"name":"FinCEN Advisory FIN-2014-A005 (funnel accounts)","url":"https://www.fincen.gov/sites/default/files/advisory/FIN-2014-A005.pdf","license":"US government work (public domain)","purpose":"The funnel-account definition behind the screen rule."},{"name":"FinCEN Advisory FIN-2022-A002 (elder financial exploitation)","url":"https://www.fincen.gov/sites/default/files/advisory/2022-06-15/FinCEN%20Advisory%20Elder%20Financial%20Exploitation%20FINAL%20508.pdf","license":"US government work (public domain)","purpose":"Older adult = 60 or over; financial red flags behind the elder rule."},{"name":"scripts/eval_sar.py and docs/evals/sar-narrative-desk.md","url":null,"license":"Apache-2.0","purpose":"The synthetic case generator, planted-error and invented-fact tests, three model draft sets, and every result file."},{"name":"POST /sar/verify and POST /sar/numbers","url":null,"license":"Apache-2.0","purpose":"Verify a report's signature and the hashes of the workpaper, filing copy and ledger; run the numeric check alone on any draft, with no model call."}],"hardware":[{"tier":"1x RTX PRO 6000 Blackwell 96 GB","fits":true,"notes":"Measured on our server: the hosted demo and the eval ran on this card through the shared gateway."},{"tier":"1x RTX 5090 32 GB","fits":true,"notes":"Estimate: Qwen3.8-27B NVFP4 needs about 20 GB of weights plus KV cache; not run for this tool."},{"tier":"CPU only","fits":true,"notes":"The lite tier (numbers and citations only, POST /sar/numbers) needs no GPU."}],"latency":[{"lane":"full narrative draft (8 sections, ~22 sentences), hosted gateway route","typical_ms":24700,"source":"measured on our server 2026-09-26: median of 15 eval runs (11.7-61 s) with the gateway shared with other workloads; 10-11 s when it was quiet"},{"lane":"no-file rationale (4 sections), hosted gateway route","typical_ms":12000,"source":"measured on our server 2026-09-26: 3 eval runs, 11.7-13.7 s"},{"lane":"check an investigator's draft (10 sentences)","typical_ms":3200,"source":"measured on our server 2026-09-26: the planted-errors sample, 2.2-10 s depending on gateway load"},{"lane":"numeric check only (POST /sar/numbers)","typical_ms":null,"source":"no model call; milliseconds on CPU (not separately timed)"}],"benchmark":null,"notes":["Numbers are checked in code, not by the model. On 200 held-out synthetic cases the checker flagged none of the 1,920 correct numbers in reference narratives and caught all 1,600 planted wrong amounts, dates and counts (1,598 before a bug fix, see the eval). Planted into the model's own sentences it caught 340 of 356 (95.5%): every amount, but 165 of 174 dates and 34 of 40 counts.","In the final eval set (15 synthetic cases, 299 drafted sentences) the model's 533 numbers all checked out; 272 sentences were traced, 23 flagged as partly supported, 4 held. Of the 4 held, one was a false hold by the judge.","Invented facts: of 20 investigator drafts with one invented sentence each, 18 were held and 2 flagged, so all 20 were caught; of 172 true sentences none was held and 19 were flagged (re-run 28 Sep 2026 after a change that cut flags on true sentences from 27 to 19; the 26 Sep run held 19 and flagged 1 invented sentence, held 1 true sentence and flagged 32).","Typologies: the screen found the planted typology in 160 of 160 held-out cases, but also flagged structuring on 5 of 40 clean cash-business cases, and funnel cases also trip structuring (13 of 40). The thresholds are ours, set on our own generator.","The judge is strict: it flags small inferences (a state read off a branch name, 'domestic', 'international') as partly supported. In a manual read of 70 traced sentences, none held an invented fact and 2 carried such a small unsupported detail.","Everything here is measured on synthetic case files written by the agent that built the checker. It has not been run on real bank data."]},"buyer_facts":[{"label":"Data retention","value":"Nothing stored: the case file lives in memory for the request. The signed report holds hashes, citations, verdicts and receipt ids, never case text; logs carry counts only."},{"label":"What leaves the box","value":"Hosted: every model call goes through our gateway to the GPU serving Qwen3.8-27B, and only synthetic case files are accepted. Self-hosted on the direct route: nothing leaves the box."},{"label":"What it will not do","value":"Decide whether to file, or file. It never says 'compliant'. A clean result reads 'every sentence traced to the case file (review still required)'."},{"label":"Input formats","value":"Transactions as CSV (date and amount required; type, direction, channel, location, counterparty, memo optional), up to 400 rows; profile and alert fields as name: value pairs; notes up to 6,000 characters; your own draft up to 12,000 characters with [T3, K.name] citations."},{"label":"Typical run","value":"A structuring draft: a few dozen model calls, a few cents or less at the gateway list price. Checking a short draft: a few calls, a fraction of a cent. Each run shows its own measured cost."}],"data_handling":{"page":"/data#sar-narrative-desk","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 stored: the case file lives in memory for the request. The signed report holds hashes, citations, verdicts and receipt ids, never case text; logs carry counts only.","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/finance/sar-narrative-desk","input":"sar","lanes":[{"id":"screen","title":"Red-flag screen","kind":"list"},{"id":"narrative","title":"Narrative, sentence by sentence","kind":"list"},{"id":"report","title":"Filing copy, workpaper and signed report","kind":"json"}],"samples":[{"n":1,"id":"structuring","title":"Structuring","deep_link":"/tools/finance/sar-narrative-desk?sample=1&autorun=0"},{"n":2,"id":"rapid-movement","title":"Rapid movement","deep_link":"/tools/finance/sar-narrative-desk?sample=2&autorun=0"},{"n":3,"id":"funnel","title":"Funnel","deep_link":"/tools/finance/sar-narrative-desk?sample=3&autorun=0"},{"n":4,"id":"elder-exploitation","title":"Elder exploitation","deep_link":"/tools/finance/sar-narrative-desk?sample=4&autorun=0"},{"n":5,"id":"clean","title":"Clean","deep_link":"/tools/finance/sar-narrative-desk?sample=5&autorun=0"},{"n":6,"id":"planted-errors","title":"Planted errors","deep_link":"/tools/finance/sar-narrative-desk?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/sar-narrative-desk-hosted.md","selfhost":"/prompts/sar-narrative-desk-selfhost.md","assemble":"/prompts/sar-narrative-desk-assemble.md","mac":"/prompts/sar-narrative-desk-mac.md"},"rehearsal":{"bundle":"/samples/sar-narrative-desk.zip","bundle_url":"https://decosa.ai/samples/sar-narrative-desk.zip","folder":"/samples/sar-narrative-desk/","expected":"/samples/sar-narrative-desk/expected.json","files":["/samples/sar-narrative-desk/expected.json","/samples/sar-narrative-desk/inputs/alert.json","/samples/sar-narrative-desk/inputs/draft.txt","/samples/sar-narrative-desk/inputs/kyc.json","/samples/sar-narrative-desk/inputs/notes.txt","/samples/sar-narrative-desk/inputs/transactions.csv"],"bytes":4197,"checks":["the run holds sentences back","the wrong total is held as a number mismatch","the held total names the figure the rows give","the shifted date is held as a number mismatch","the invented wire is held","the invented wire is named as not in the case file, not as a number mismatch","two numbers do not match and one is not in the case file at all","the invented amount is counted as not found","the screen finds structuring","the filing copy drops the invented wire","the filing copy has no citation brackets","the signed report verifies","the report matches the ledger it was run on","a report with its status changed to all_checked no longer verifies","every model call has a signed receipt"],"licence":"Synthetic: every person, account, business and the bank (Example Community Bank) are fictional, generated by decosa_api/verticals/sar/synth.py. Part of decosa-api, AGPL-3.0-or-later.","about":"A synthetic structuring case (a transactions CSV, KYC and alert fields, investigator notes) and an investigator draft with citations, in which three things were planted: a total $1,000 too high, a date moved by two days, and a $25,000 wire that is not in the ledger. Check mode makes no drafting call: every number is recomputed from the cited rows and each sentence is judged against what it cites. The three planted sentences must be held, the right figures named, the screen must find structuring, the filing copy must drop the held sentences and the citations, and the signed report must verify and catch a changed status.","run":{"containers":"docker compose exec api python scripts/rehearse.py sar-narrative-desk","checkout":"python scripts/rehearse.py sar-narrative-desk --bundle sar-narrative-desk.zip --base-url http://127.0.0.1:8445","mac":".venv/bin/python scripts/rehearse.py sar-narrative-desk"},"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=sar-narrative-desk","data":"/api/hardware.json","tiers":[{"id":"lite","gpu_gb":0,"basis":null,"unknown":[]},{"id":"standard","gpu_gb":57.6,"basis":"stack","unknown":[]},{"id":"alternate-ocr","gpu_gb":0,"basis":null,"unknown":["ocr"]}],"mac":{"fit":"full","memory_gb":32}},"links":{"page":"/tools/finance/sar-narrative-desk","json":"/use-cases/sar-narrative-desk.json","metrics":"/metrics/sar-narrative-desk","console":"/tools/finance/sar-narrative-desk","console_sample":"/tools/finance/sar-narrative-desk?sample=1&autorun=0","stack":"/tools/finance/sar-narrative-desk#stack","try_live":"/tools/finance/sar-narrative-desk","watch":"/tools/finance/sar-narrative-desk","build":"/tools/finance/sar-narrative-desk#build","self_host":"/tools/finance/sar-narrative-desk#self-host","prompts":{"hosted":"/prompts/sar-narrative-desk-hosted.md","selfhost":"/prompts/sar-narrative-desk-selfhost.md","assemble":"/prompts/sar-narrative-desk-assemble.md","mac":"/prompts/sar-narrative-desk-mac.md"}}}