{"schema_version":"1","site":"https://decosa.ai","id":"split-sheet-check","num":"39","name":"Split-sheet and metadata checker","tool_name":"Check split sheets and metadata","short":"Split sheets","blurb":"Reconciles split sheets, release metadata (DDEX ERN or a distributor CSV), contract excerpts and PRO or MLC registration exports. Code checks every ISRC, ISWC, IPI and UPC check digit and adds up every split; an open model reads the messy documents, and every value it reads must be found in the document. You get each discrepancy with the lines it came from, a proposed credit sheet to confirm, and a signed record.","status":"live","labels":{"industry":["music"],"job":["review","attest"],"input":["files","text"],"deploy":["hosted","selfhost"],"status":"live","output":["data","record"],"data":["pii","confidential"],"hardware":"gpu-96","licence":"permissive"},"industries":["music"],"runs_in":["hosted","selfhost"],"part_of":["studio-checks"],"built_from":["typed-judgment","grounding","signed-record"],"models":"Qwen3.8-27B","where":"Hosted or self-host; unreleased catalogs and contracts on your own machine","hardware":"1× RTX PRO 6000 (96 GB) or 1× RTX 5090 (32 GB) for the model; parsing, OCR and every check run on CPU","final_artifact":"A reconciliation report with every discrepancy and its sources, a confirmed credit sheet (CSV), and signed records of the check and the confirmation.","self_host_first":false,"verification":{"receipt_coverage":"full","summary":"Receipt per model call; signed check record and signed confirmed credit sheet","manual_qa":{"hosted":{"date":"2026-09-25","result":"pass","p50_ms":6728,"p95_ms":null,"runs":null,"receipts_per_run":5,"cost_per_run_usd":0.00303},"selfhost":{"date":"2026-09-25","result":"pass","method":"Fresh clone of the branch into a clean directory, docker build of docker/api/Dockerfile (with Tesseract), the api service with a named volume, pointed at the already-running local vLLM (Qwen3.8-27B NVFP4 on 127.0.0.1:8114) through host networking; then torn down.","notes":"The image builds with OCR on; the planted sample runs end to end on the direct route in 4.5 s (5 attested calls, the same 9 issues as hosted) and the scanned sample in 5.2 s (OCR in the container); the signed record verifies; no names or titles reach the logs. The model server's own startup was not re-verified (no new GPU load)."},"known_limits":["Measured on synthetic, fictional catalogs only; real exports from each society and distributor have their own layouts.","Handwriting-style scans read through Tesseract lose identifiers (33.9% of IPIs read correctly); they are marked as OCR and not trusted.","A valid check digit says an identifier is well formed, not that it is registered to the person named.","One release at a time (12 documents hosted); no bulk catalog mode and no CWR filing.","Latency depends on the shared gateway: 30-100 s per release was measured while it was saturated."],"nightly_covers":null},"nightly":"https://api.decosa.ai/verify/status"},"eval_summary":{"metrics":[{"name":"Planted errors found","value":"43 of 43","unit":null,"n":43,"split":"test","note":null},{"name":"Precision, all catalogs","value":"64.8%","unit":null,"n":null,"split":"test","note":"Knock-on issues counted separately (9)."},{"name":"Precision, typed split sheets only","value":"19 of 19","unit":null,"n":19,"split":"test","note":"15 catalogs; no false alarm."},{"name":"Precision, catalogs with a scanned split sheet","value":"27 of 52","unit":null,"n":52,"split":"test","note":"All 25 false alarms trace to OCR."},{"name":"IPI extracted correctly from handwriting-style scans via OCR","value":"33.9%","unit":null,"n":59,"split":"test","note":"100% on typed sheets (162 writers)."},{"name":"Share sums and identifiers recomputed independently, disagreements","value":"0 on 151 share sums and 374 identifiers","unit":null,"n":null,"split":"test","note":null}],"dataset":"Synthetic, fictional catalogs from our own generator (2-3 song releases with split sheets in five styles including handwriting-font scans, DDEX ERN or distributor CSV, society registration export, contract excerpts), 0-3 planted errors each. Dev 8 catalogs; test 30 catalogs with 43 planted errors, run once after dev was frozen.","held_out":true,"caveats":["Synthetic data from our own generator; the generator and the checker were written by the same agent, so the structured formats are friendly to the parser.","Handwriting fonts are not handwriting; real handwritten sheets will do worse through Tesseract.","Scanned split sheets bring many OCR false alarms (25 of 52 issues).","One run; output at temperature 0 on a shared gateway can still vary slightly."],"date":"2026-09-25","doc_url":"https://decosa.ai/metrics/evals/split-sheet-check"},"stack":{"summary":"Load a release's documents: split sheets (text, PDF, DOCX, email or a scan), the release metadata as a DDEX ERN message or a distributor CSV, publishing contract excerpts and society registration exports. Code parses the structured files, adds up every split with exact fractions and checks every ISRC, ISWC, IPI and UPC. An open model reads the messy documents, one receipted call each, and every value it reads must be found in the document before it is used; it also answers typed questions code cannot (is \"J. Okafor\" the same writer as \"Jude Okafor\"?). The result is a list of discrepancies (splits over or under 100%, missing co-writers, role and society mismatches, missing publishers, bad check digits), each citing the line, CSV row or DDEX path in every source, and a proposed credit sheet that a person edits and confirms. Code re-checks the confirmed sheet before it signs it.","tagline":"Split sheets, DDEX or distributor metadata, contracts and PRO or MLC registrations reconciled: every discrepancy with the lines it came from, a credit sheet to confirm, and signed records.","deployment":"hosted-or-self-host","regulatory_note":"A checking aid for songwriters, managers, publishers and distributors, not legal or accounting advice. Background, checked 25 Sep 2026: a recording carries two copyrights, the sound recording (identified by ISRC, ISO 3901) and the musical work (ISWC, ISO 15707); writers and publishers are identified by CISAC IPI numbers and releases by GS1 UPC/EAN. In the US the performing-rights societies (ASCAP, BMI, SESAC, GMR) pay the writer's and the publisher's share separately. The Orrin G. Hatch-Bob Goodlatte Music Modernization Act (signed 11 Oct 2018) created a blanket mechanical licence for digital services administered by the Mechanical Licensing Collective (The MLC, designated by the Copyright Office in July 2019; the blanket licence has been available since 1 Jan 2021); royalties The MLC cannot match to a registered work are held and, after a statutory holding period, can be distributed by market share to other copyright owners (17 U.S.C. 115(d)(3)(H)-(J)). A valid check digit means an identifier is well formed, not that it is registered to the person named; the writers agree the splits, and a society pays on its own registration. Rules and forms differ by society and territory. Writer names and IPI numbers are personal data and deal terms are confidential: use the hosted demo for released metadata and test catalogs, and self-host for unreleased catalogs and contracts. Model licence: Apache-2.0 (Qwen3.8-27B); OCR: Tesseract (Apache-2.0).","components":[{"id":"checker","role":"Checker: DDEX and CSV parsing, OCR, identifier check digits, exact share arithmetic, grounding of every model-read value, reconciliation, the proposed sheet and signed records (no model; CPU)","name":"decosa-api splits module (decosa_api/verticals/splits) with Tesseract OCR","hf_repo":null,"license":"AGPL-3.0-or-later (decosa-api; Tesseract 5)","params":null,"quant":null,"vram_gb":0,"memory_gb_estimate":null,"engine":"Python 3.12; expat for DDEX (no DTD, no entities); Fraction arithmetic; Tesseract 5 and poppler for scans; the grounding checker's lexical test and the typed-judgment prompt and calibration","receipt_coverage":"partial","in_hosted_demo":null,"tiers":["lite","standard"],"alternative_to":null},{"id":"reader","role":"Model: reads split sheets and contract excerpts (values copied as written, with line numbers) and answers typed same-writer and role questions","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","receipt_coverage":"strong","in_hosted_demo":true,"tiers":["standard"],"alternative_to":null},{"id":"vl-reader","role":"Vision-language model to read scanned or handwritten split sheets directly (alternate)","name":"Qwen2.5-VL-7B-Instruct","hf_repo":"Qwen/Qwen2.5-VL-7B-Instruct","license":"Apache-2.0","params":"8.3B","quant":null,"vram_gb":null,"memory_gb_estimate":null,"engine":"vLLM (not served here)","receipt_coverage":"none","in_hosted_demo":false,"tiers":["alternates"],"alternative_to":null}],"tiers":[{"id":"lite","label":"Lite · code only, any CPU","summary":"DDEX, distributor and registration files parsed; every identifier and share sum checked; sources compared. Split sheets and contracts are not read (POST /splits/parse or \"extract\": false).","components":["checker"],"hardware":"Any CPU","quality_evidence":[{"metric":"Identifiers and share sums in the reports rechecked by an independent implementation (disagreements)","value":"0 of 374 identifiers, 0 of 151 sums","source":"decosa-api docs/evals/split-sheet-check.md, 2026-09-25; synthetic catalogs from scripts/splits_data.py (fictional), test seed held out"},{"metric":"Planted identifier errors found (ISWC, IPI, UPC check digits; malformed ISRC)","value":"ISWC check digit 3/3; IPI check digits 4/4; UPC check digit 5/5; malformed ISRC 6/6","source":"decosa-api docs/evals/split-sheet-check.md, 2026-09-25; synthetic catalogs from scripts/splits_data.py (fictional), test seed held out"}],"latency_note":"measured: well under a second per release.","in_hosted_demo":true,"receipt_coverage":"partial","receipt_note":"No model calls, so no receipts; the record is signed by the instance.","hosting":null},{"id":"standard","label":"Standard · one 96 GB card (measured; hosted demo)","summary":"Qwen3.8-27B reads the split sheets and contracts and answers the typed field questions; everything else is the lite tier's code. Also fits a 32 GB card (estimate).","components":["checker","reader"],"hardware":"1x RTX PRO 6000 96 GB","quality_evidence":[{"metric":"Planted errors found, 30 held-out synthetic catalogs (43 planted)","value":"43 of 43 (100.0%): IPI check digits 4/4; malformed ISRC 6/6; ISWC check digit 3/3; missing co-writer 6/6; missing publisher 1/1; society mismatch 5/5; composer/lyricist swap 8/8; 105% split 5/5; UPC check digit 5/5","source":"decosa-api docs/evals/split-sheet-check.md, 2026-09-25; synthetic catalogs from scripts/splits_data.py (fictional), test seed held out"},{"metric":"Issues that are a planted error, not a false alarm (knock-on effects of a planted error excluded)","value":"64.8%: id_invalid 18/36; missing_writer 6/9; pro_mismatch 5/6; publisher_mismatch 0/2; publisher_missing 2/2; role_mismatch 8/8; share_total 7/7; share_unreadable 0/1","source":"decosa-api docs/evals/split-sheet-check.md, 2026-09-25; synthetic catalogs from scripts/splits_data.py (fictional), test seed held out"},{"metric":"Issues that are a planted error, split by whether the catalog has a scanned split sheet","value":"typed-only catalogs (15): 19 of 19, no false alarm; catalogs with a scan (15): 27 of 52, every false alarm traces to an OCR misread (22 of the 25 are warnings marked as OCR)","source":"decosa-api docs/evals/split-sheet-check.md, 2026-09-25; synthetic catalogs from scripts/splits_data.py (fictional), test seed held out"},{"metric":"Unknown role words (\"beat + chords\", \"wrote the lyrics\") resolved by the typed role question","value":"10 of 10 correct","source":"decosa-api docs/evals/split-sheet-check.md, 2026-09-25; synthetic catalogs from scripts/splits_data.py (fictional), test seed held out"},{"metric":"False alarms on the 7 clean catalogs","value":"3","source":"decosa-api docs/evals/split-sheet-check.md, 2026-09-25; synthetic catalogs from scripts/splits_data.py (fictional), test seed held out"},{"metric":"Split-sheet values read correctly, typed sheets (162 writers)","value":"name 100.0%, share 100.0%, role 93.8%, ipi 100.0%, pro 100.0%, publisher 100.0%","source":"decosa-api docs/evals/split-sheet-check.md, 2026-09-25; synthetic catalogs from scripts/splits_data.py (fictional), test seed held out"},{"metric":"Split-sheet values read correctly, handwriting-style scans through OCR (59 writers)","value":"name 98.3%, share 96.6%, role 98.3%, ipi 33.9%, pro 96.6%, publisher 94.9%","source":"decosa-api docs/evals/split-sheet-check.md, 2026-09-25; synthetic catalogs from scripts/splits_data.py (fictional), test seed held out; Tesseract 5 on synthetic handwriting fonts, not real handwriting"},{"metric":"Dev catalogs (8, used to fix the prompt and the OCR handling): planted found / precision","value":"10 of 10 / 83.3%","source":"decosa-api docs/evals/split-sheet-check.md, 2026-09-25; synthetic catalogs from scripts/splits_data.py (fictional), dev seed"}],"latency_note":"measured on our server, shared gateway: seconds per release, up to a couple of minutes at the slowest; a fraction of a cent per release at the gateway's list price.","in_hosted_demo":true,"receipt_coverage":"strong","receipt_note":"Hosted: every model call has its own gateway-signed receipt, listed in the signed record.","hosting":null}],"alternates":[{"id":"vl-reader","label":"A vision-language reader for scans","components":["vl-reader"],"hardware":"1x 96 GB card","use":"Read scanned and handwritten split sheets as images instead of through OCR. Page 32 suggests the standard reader's own vision tower (Qwen3.8-27B, same weights) plus a layout model instead of this Jan 2025 7B.","status":"not served"}],"services":[{"name":"decosa-api","port":8445,"image":"${DECOSA_REGISTRY}/decosa-api:<tag>","purpose":"GET /splits/info, /splits/samples; POST /splits/check (SSE or JSON), /splits/parse (code only), /splits/ids; POST /splits/runs/{id}/confirm; GET /splits/runs/{id}/export?format=csv|md|record|sheet. Documents stay in memory for the request and runs for one hour, never on disk; logs carry counts only. The image includes Tesseract and poppler."},{"name":"vLLM","port":8114,"image":"vllm/vllm-openai@sha256:c2914767605584b6d8f45686b82de173ecc99e781897aa3d0a66dacd72c51ae1","purpose":"Qwen3.8-27B NVFP4 behind our gateway (hosted) or called directly (self-host)."}],"tools":[{"name":"DDEX ERN 4.3 schema (release-notification.xsd)","url":"http://service.ddex.net/xml/ern/43/release-notification.xsd","license":"Published by DDEX for implementers","purpose":"The demo and eval DDEX messages are built from it and validate against it (lxml, 25 Sep 2026); the parser also reads ERN 3.8 contributor elements."},{"name":"django-music-publisher validators","url":"https://github.com/matijakolaric-com/django-music-publisher","license":"MIT","purpose":"Cross-check of the IPI (modulo 101) and ISWC check-digit formulas and their test vectors; our code is our own implementation."},{"name":"Patrick Hand and Kalam fonts","url":"https://fonts.google.com/","license":"SIL Open Font License 1.1","purpose":"Draw the handwriting-style scanned split sheets in the synthetic eval set."},{"name":"scripts/splits_data.py and scripts/splits_eval.py","url":null,"license":"Apache-2.0","purpose":"Generate fictional catalogs with planted errors and an answer key; score detection, extraction and arithmetic against a running server."},{"name":"POST /record/verify","url":null,"license":"Apache-2.0","purpose":"Checks the signed check record or confirmed sheet and names the first entry that was changed. The console also verifies it in your browser."}],"hardware":[{"tier":"Any CPU (code only)","fits":true,"notes":"Measured: parsing a DDEX message and a registration export and every identifier and sum check take well under a second; OCR of a one-page scan takes a few seconds. No GPU."},{"tier":"1x RTX 5090 32 GB","fits":true,"notes":"Qwen3.8-27B NVFP4 needs about 20 GB of weights plus a small KV cache (split sheets are short). Estimate: same model and prompts as the measured card, not run here on a 5090."},{"tier":"1x RTX PRO 6000 Blackwell 96 GB","fits":true,"notes":"Measured on our server: the eval and the hosted demo ran on this card, shared with other services the whole time."}],"latency":[{"lane":"The planted demo EP (7 documents, 5 model calls), hosted gateway route","typical_ms":6728,"source":"measured on our server 2026-09-25: 6.6-7.7 s over 3 smoke runs of the planted sample (5 calls, at most 2 in flight) with the gateway quiet; 42-63 s while other workloads saturated it"},{"lane":"A synthetic release (4-8 documents), hosted gateway route, at most 2 calls in flight","typical_ms":9000,"source":"measured on our server 2026-09-25: median over 30 test catalogs, max 119.0 s (the slow ones ran while other workloads saturated the shared gateway)"}],"benchmark":null,"notes":["The model never adds up a share or checks a digit: it copies what the documents say, and code finds every value in the document before using it. Values it cannot find are shown as not found and left out.","An identifier that fails its check on a scan but matches a valid one in another source is reported as a probable OCR misread, not an error; one with no match is a warning, marked as OCR.","Registration and distributor CSVs are matched by header names (title, writer or first and last name, role, IPI or CAE, society, share, publisher). An export whose writers and publishers add to one 100% scale (writers 50 + publishers 50) is detected and doubled per side.","Two spellings of a writer are merged by rule (same IPI, same name) or by a typed yes/no question to the model; every merge is listed, and a low-confidence one is flagged for a person.","Not included: filing registrations (CWR), bulk catalogs of thousands of works, the societies' own portals, or sound-recording splits (master royalties)."]},"buyer_facts":[{"label":"Data retention","value":"Documents are held in memory for the request; the run (report and proposal) for one hour, for the token or key that made it. Nothing is written to disk; logs carry counts only."},{"label":"What leaves the box","value":"Self-hosted: nothing. Hosted: the documents go to the model through our gateway, which is why the hosted demo is for released metadata and test catalogs."},{"label":"Model cost per release","value":"A fraction of a cent per release on average at the gateway's list price (measured on synthetic releases); GPU time only when self-hosted."},{"label":"Input","value":"Split sheets and contracts as text, PDF, DOCX or scans (PNG, JPEG, image-only PDF); release metadata as DDEX ERN XML or CSV; registrations as CSV. Hosted limits: 12 documents, 8 of them read by the model, 4 MB per file."},{"label":"Output","value":"Discrepancies with the source lines, a proposed credit sheet (CSV) that a person confirms, a Markdown report, and signed records of the check and the confirmed sheet."}],"data_handling":{"page":"/data#split-sheet-check","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":"Documents are held in memory for the request; the run (report and proposal) for one hour, for the token or key that made it. Nothing is written to disk; 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/media/split-sheet-check","input":"splits","lanes":[{"id":"issues","title":"Discrepancies","kind":"list"},{"id":"sheet","title":"Proposed credit sheet","kind":"list"},{"id":"record","title":"Signed records","kind":"json"}],"samples":[{"n":1,"id":"harbor-lights-planted","title":"Harbor lights planted","deep_link":"/tools/media/split-sheet-check?sample=1&autorun=0"},{"n":2,"id":"harbor-lights-clean","title":"Harbor lights clean","deep_link":"/tools/media/split-sheet-check?sample=2&autorun=0"},{"n":3,"id":"copper-moon-scan","title":"Copper moon scan","deep_link":"/tools/media/split-sheet-check?sample=3&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/split-sheet-check-hosted.md","selfhost":"/prompts/split-sheet-check-selfhost.md","assemble":"/prompts/split-sheet-check-assemble.md","mac":"/prompts/split-sheet-check-mac.md"},"rehearsal":{"bundle":"/samples/split-sheet-check.zip","bundle_url":"https://decosa.ai/samples/split-sheet-check.zip","folder":"/samples/split-sheet-check/","expected":"/samples/split-sheet-check/expected.json","files":["/samples/split-sheet-check/expected.json","/samples/split-sheet-check/inputs/copper-moon/low-orbit-society-registration-export.csv","/samples/split-sheet-check/inputs/copper-moon/tin-roof-rain-split-sheet.txt","/samples/split-sheet-check/inputs/copper-moon/wildflower-radio-ep-distributor-metadata.csv","/samples/split-sheet-check/inputs/copper-moon/wildflower-radio-split-sheet-scan.pdf","/samples/split-sheet-check/inputs/harbor-lights/co-publishing-agreement-junie-castellanos.txt","/samples/split-sheet-check/inputs/harbor-lights/co-publishing-agreement-tobias-okafor.txt","/samples/split-sheet-check/inputs/harbor-lights/harbor-lights-ep-ddex-ern-4.3.xml","/samples/split-sheet-check/inputs/harbor-lights/harbor-lights-split-sheet.txt","/samples/split-sheet-check/inputs/harbor-lights/marisol-the-tides-society-registration-export.csv","/samples/split-sheet-check/inputs/harbor-lights/northbound-hymn-split-sheet.eml.txt","/samples/split-sheet-check/inputs/harbor-lights/the-long-way-round-split-sheet.txt"],"bytes":127032,"checks":["all seven documents are read","the 105% split is found","the wrong ISWC check digit is found","the co-writer missing from a source (Beatriz Thibodeaux) is found","the society mismatch (Tobias Okafor) is found","the composer/lyricist swap (Junie Castellanos) is found","the scanned split sheet is read by OCR: its writers are found","the wrong UPC check digit in the distributor CSV is found","the wrong IPI check digit is found","the signed record verifies","a record with its error count changed no longer verifies","every model call has a signed receipt"],"licence":"Fictional catalog generated by scripts/splits_data.py (seeded): names, songs, societies' registrations and identifiers are invented. Part of decosa-api, AGPL-3.0-or-later.","about":"A fictional three-song EP: three split sheets, a DDEX release file, a society registration export and two co-publishing contract excerpts, with planted errors. The check must read every document and find the 105% split, the wrong ISWC check digit, the co-writer missing from a source and the society mismatch, and end in a signed record that verifies. A second, smaller catalog adds a scanned split sheet (PDF, read by OCR) and a distributor CSV with a wrong UPC check digit.","run":{"containers":"docker compose exec api python scripts/rehearse.py split-sheet-check","checkout":"python scripts/rehearse.py split-sheet-check --bundle split-sheet-check.zip --base-url http://127.0.0.1:8445","mac":".venv/bin/python scripts/rehearse.py split-sheet-check"},"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=split-sheet-check","data":"/api/hardware.json","tiers":[{"id":"lite","gpu_gb":0,"basis":null,"unknown":[]},{"id":"standard","gpu_gb":57.6,"basis":"stack","unknown":[]},{"id":"alternate-vl-reader","gpu_gb":20.9,"basis":"estimate","unknown":[]}],"mac":{"fit":"full","memory_gb":32}},"links":{"page":"/tools/media/split-sheet-check","json":"/use-cases/split-sheet-check.json","metrics":"/metrics/split-sheet-check","console":"/tools/media/split-sheet-check","console_sample":"/tools/media/split-sheet-check?sample=1&autorun=0","stack":"/tools/media/split-sheet-check#stack","try_live":"/tools/media/split-sheet-check","watch":"/tools/media/split-sheet-check","build":"/tools/media/split-sheet-check#build","self_host":"/tools/media/split-sheet-check#self-host","prompts":{"hosted":"/prompts/split-sheet-check-hosted.md","selfhost":"/prompts/split-sheet-check-selfhost.md","assemble":"/prompts/split-sheet-check-assemble.md","mac":"/prompts/split-sheet-check-mac.md"}}}