AI-powered MEP quality control

Catch MEP design errors
before they get built

Upload plans, schedules, and specs. Get evidence-backed findings across mechanical, electrical, and plumbing — in minutes.

First check free Results in minutes Files deleted on request
Real findings from real projects
Critical⚡ ElectricalPanel LP-2A loaded at 112% — three circuits must be redistributed before permitSheet E2.1
Major🌬️ MechanicalSupply duct to Zone 4 undersized for 1,800 CFM at specified static pressureSheet M3.0
Minor💧 PlumbingNo cleanout at base of 4″ soil stack — required per IPC §708.3.2Sheet P2.2

Every finding includes the sheet location and code reference.


Process

Three steps from upload
to report

No training. No configuration. Drop in your documents and get a structured QA/QC report with code references in minutes.

📐
01

Upload your documents

Drag in PDFs of plans, equipment schedules, and specifications. Supports scanned drawings, image exports, and text-based specs up to 20 files per review.

🤖
02

AI reviews all disciplines simultaneously

MEPCheck AI checks mechanical, electrical, plumbing, and cross-discipline coordination in one pass — exactly what a senior engineer would catch, in minutes.

📊
03

Download your report

Every issue is tagged by discipline, severity, sheet location, and applicable code section. Export as a printable PDF or filterable Excel workbook.


Sample report

See exactly what you'll get

Every finding is specific, actionable, and backed by a code reference. No vague summaries.

Critical ⚡ Electrical Emergency egress lighting on non-emergency circuit

Exit and egress luminaires on Levels 2–4 are wired to standard branch circuits rather than the emergency panel. A utility outage would leave all egress paths unlit. Rewire to EPanel-1 or install integral battery backup units per code.

📘 NEC 2023 §700.10 · NFPA 101 §7.9 · Sheet E4.2
Major 🌬️ Mechanical Exhaust fan discharge conflicts with outdoor air intake

Toilet exhaust fan EF-3 discharges at roof level 6′-2″ from the dedicated OA intake for AHU-2. Minimum separation required is 10′-0″ per IMC to prevent re-entrainment of contaminants into the supply air stream. Relocate EF-3 discharge to the north parapet.

📘 IMC 2021 §501.3.1 · Sheet M5.1
Major 💧 Plumbing No backflow preventer on irrigation tie-in to domestic supply

Landscape irrigation connects directly to the domestic cold water main at Grid C-12 with no backflow prevention assembly shown. A reduced-pressure zone (RPZ) assembly is required at this cross-connection to protect potable water quality.

📘 IPC 2021 §608.16.4 · ASSE 1013 · Sheet P3.0
Advisory 🔗 Coordination MEP conflict in corridor ceiling — 2″ clearance

At Grid Line 5 between Axes C–D, the 2nd-floor corridor ceiling plenum shows a 14″ supply duct, a 4″ domestic hot water pipe with insulation, and a conduit bundle all routed at the same elevation. Available clearance drops to approximately 2″. Recommend a coordination drawing and elevation adjustment before rough-in.

📘 Coordination conflict · Sheets M2.1, P2.0, E3.1
📋

Your full report includes:

  • Executive risk summary
  • Every issue with code citation
  • Discipline-by-discipline breakdown
  • Prioritized next steps
  • PDF + Excel export

What gets checked

Every discipline.
Every common failure mode.

🌬️

Mechanical

Duct sizing vs. design CFM, equipment schedule consistency, supply/exhaust balance, maintenance clearances, and missing coordination notes.

Duct velocityEquipment schedulesAirflow balanceAccess clearance

Electrical

Panel schedule loading, wire sizing vs. breaker amperage, lighting power density vs. code, missing arc flash labeling, and disconnect requirements.

Panel loadsWire sizingLPD complianceNEC 2023
💧

Plumbing

Pipe sizing for DFUs and flow rates, venting configurations, cleanout locations, backflow prevention gaps, and trap primer requirements.

DFU sizingVentingBackflowIPC 2021
🔗

Coordination

Cross-discipline conflicts in ceiling and wall cavities, uncoordinated structural penetrations, equipment that won't fit access routes, and RCP conflicts.

Ceiling conflictsStructural penetrationsRCP coordination

Who it's for

Built for everyone
who touches MEP documents

🏗️

MEP Engineers

Catch your own errors before submitting to the GC or AHJ. Use MEPCheck as a pre-submission QC gate on every set of drawings.

📋

General Contractors

Review subcontractor submittals and coordination drawings for conflicts before they hit the field and become expensive RFIs.

🏢

Owners & Developers

Protect your budget at design review milestones. Identify scope gaps and coordination errors before construction pricing is locked.

🔍

Plan Checkers & Inspectors

Pre-screen submittals in minutes. Triage review workload by severity. Focus your expertise where it matters most.

⚖️

Owner's Representatives

Provide independent QC oversight without needing deep technical MEP expertise. Get plain-language findings with code citations.

🎓

Design-Build Teams

Continuously validate coordination across fast-tracked design packages. Catch issues at each revision before they compound.


Pricing

Pay per review, or subscribe
and save.

Starter
$49
per review · no subscription

  • 1 project review
  • Up to 50 pages per review
  • PDF export
  • Excel export
  • Priority processing
Team
$799
per month · up to 5 engineers
20% Savings

  • 150 reviews per month
  • Up to 50 pages per review
  • PDF & Excel export
  • Priority processing
  • 5 team seats + shared library
Enterprise
Custom
contact us for pricing

  • Unlimited reviews
  • Up to 200 pages per review
  • PDF & Excel export
  • Priority processing
  • Unlimited team seats
  • Custom integrations & SSO
  • Dedicated support

Privacy & Data Handling

We review your drawings.
We don’t keep them.

MEP drawings often contain proprietary details, unreleased designs, and client-sensitive data. Here’s exactly how we handle what you upload.

⏱️

Processed, then discarded

Uploaded files are used only for the duration of your review. Once the report is generated, documents are not retained on our servers.

🚫

Never used for AI training

Your drawings do not feed back into any model. What you upload is specific to your review and is never shared or repurposed.

🔐

Encrypted in transit

All file transfers use TLS 1.3 encryption. Nothing travels over the wire in plain text, from upload through to report delivery.

📋

No account required to start

Your first review needs only an email address. No company profile, no project database — no data we don’t need to do the job.


FAQ

Common questions

MEPCheck AI accepts PDFs including scanned drawings, PNG and JPEG images, and plain text files such as specifications or equipment schedules saved as .txt or .csv. For the most reliable results, upload drawing files as PDF exports directly from your CAD or BIM software. Scanned images work but may produce less precise findings if the scan quality is low.
MEPCheck AI consistently identifies the most common and costly MEP errors - panel overloads, duct undersizing, missing code-required elements, backflow prevention gaps, and cross-discipline coordination conflicts. It applies the same systematic checklist on every review, which means it does not miss items due to fatigue or time pressure the way a manual review might. That said, AI review works best as a rigorous first pass. It does not replace the professional judgment of the engineer of record, and its findings should be reviewed and confirmed by a licensed engineer before any design decisions are made.
By default, MEPCheck AI references ASHRAE 90.1-2022 for mechanical energy compliance, NEC 2023 for electrical, IPC 2021 for plumbing, and IMC 2021 for mechanical systems. If your jurisdiction has adopted a different edition, simply note it in the Reviewer Notes field before running your review and the AI will apply those versions instead. State and local amendments can also be specified in the notes.
Each plan includes a maximum number of drawing pages per review session - 10 for the free check, 50 for Starter, 50 for Single User and Team, and 200 for Enterprise. This is measured by the total size of the files you upload, not the literal page count shown in your PDF viewer, so a dense high-resolution drawing set may use your page allowance faster than a lighter file of the same sheet count. If your plan set is large, splitting it by discipline produces more focused findings in each report.
Yes. The most effective approach for large projects is to split submissions by discipline - run the mechanical sheets as one review, electrical as a second, and plumbing and coordination as a third. This keeps each review focused, produces cleaner findings, and fits within the per-review page limits. Single User and Team plans include enough monthly reviews to cover a full project this way without any additional cost.
Yes - no credit card required. Click "Run your first free check" from any page and MEPCheck AI opens immediately. The free check is limited to one review of up to 10 pages so you can see exactly how the tool works and what a report looks like before deciding on a plan. After your free check, you can purchase a Starter review or subscribe to Single User or Team.
After purchasing the Team plan, you will be taken to a team management portal where you can assign the remaining four seats to colleagues by entering their name and email. Each engineer receives a unique access token and can open the MEPCheck AI tool independently. The 150 reviews per month are shared across all five seats with no per-seat limit, so your team can distribute usage however makes sense for your workload. The account holder is the billing contact and can reassign seats at any time.
No. Files you upload are processed in real time to generate your report and are not retained on any server afterward. Your documents are never used to train AI models, never shared with third parties, and never stored in a project database. The review runs entirely within your browser session - once you close the tab, the files are gone. If you have specific confidentiality requirements, contact us about Enterprise options.
No. MEPCheck AI is a QA/QC assistance tool, not a licensed engineering service. It identifies issues, flags code concerns, and surfaces coordination conflicts - but it does not provide a professional engineering opinion, take liability for findings, or replace the stamp and judgment of the engineer of record. Use it to strengthen your review process, reduce RFIs, and catch errors earlier in the design cycle.

Stop finding errors in the field.
Find them now.

Run your first MEP review free. Results in minutes.

No credit card required First check free Files deleted on request
MEPCheck AI TEAM PLAN
'; var blob = new Blob([html],{type:"text/html"}); var url = URL.createObjectURL(blob); var win = window.open(url,"_blank"); if (win) win.onload = function(){ win.print(); URL.revokeObjectURL(url); }; } var filtered = (result ? result.issues||[] : []).filter(function(i) { return (fDisc==="All"||i.discipline===fDisc) && (fSev==="All"||i.severity===fSev); }); var sc = (result?result.issues||[]:[]).reduce(function(a,i){a[i.severity]=(a[i.severity]||0)+1;return a;},{}); var dc = (result?result.issues||[]:[]).reduce(function(a,i){a[i.discipline]=(a[i.discipline]||0)+1;return a;},{}); var s = { ink:"#0f1117", mid:"#1a1f2e", rule:"#1e2535", mu:"#64748b", wh:"#f1f5f9" }; var h = React.createElement; var children = []; if (PLAN_TIER === "free") { children.push(h("div",{key:"banner",style:{background:"rgba(59,130,246,.08)",borderBottom:"1px solid rgba(59,130,246,.2)",padding:"10px 32px",fontSize:13,color:"#93c5fd",display:"flex",alignItems:"center",justifyContent:"space-between",flexWrap:"wrap",gap:8}}, h("span",null,"🎁 Free check — 1 review, up to 10 pages. ",h("strong",null,"No credit card required.")), h("span",{style:{color:"#475569",fontSize:12}},"Upgrade for full access.") )); } var inner; if (!result) { inner = h("div",{style:{display:"grid",gridTemplateColumns:"1fr 340px",gap:24}}, h("div",null, h("label",{style:{fontSize:12,fontWeight:600,color:"#94a3b8",textTransform:"uppercase",letterSpacing:".08em"}},"Project Name"), h("input",{value:proj,onChange:function(e){setProj(e.target.value);},placeholder:"e.g. Riverside Medical Office — Level 3 MEP", style:{width:"100%",marginTop:8,marginBottom:20,background:s.mid,border:"1px solid "+s.rule,borderRadius:8,padding:"10px 14px",color:s.wh,fontSize:14,outline:"none",boxSizing:"border-box"}}), h("div",{onDragOver:function(e){e.preventDefault();setDrag(true);},onDragLeave:function(){setDrag(false);}, onDrop:function(e){e.preventDefault();setDrag(false);addFiles(e.dataTransfer.files);}, onClick:function(){fRef.current&&fRef.current.click();}, style:{border:"2px dashed "+(drag?"#3b82f6":s.rule),borderRadius:12,padding:"40px 24px",textAlign:"center",cursor:"pointer",background:drag?"#1a2235":"#131720"}}, h("div",{style:{fontSize:32,marginBottom:12}},"📐"), h("div",{style:{fontWeight:600,color:"#cbd5e1",marginBottom:4}},"Drop MEP documents here"), h("div",{style:{fontSize:13,color:"#475569"}},"PDFs, images, specs (.txt/.csv) · or click to browse"), h("input",{ref:fRef,type:"file",multiple:true,accept:".pdf,.png,.jpg,.jpeg,.txt,.csv",style:{display:"none"},onChange:function(e){addFiles(e.target.files);}}) ), h("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",marginTop:10,marginBottom:4}}, h("span",{style:{fontSize:12,color:s.mu}},"Documents added"), h("span",{style:{fontSize:12,fontWeight:600,color:s.mu}},files.length) ), limitWarn&&h("div",{style:{background:"#1c1810",border:"1px solid #92400e",borderRadius:8,padding:"10px 14px",fontSize:13,color:"#fbbf24",marginBottom:8}},"⚠️ "+limitWarn), files.length>0&&h("div",{style:{marginTop:8,display:"flex",flexDirection:"column",gap:8}}, files.map(function(f){ return h("div",{key:f.name,style:{display:"flex",alignItems:"center",gap:12,background:s.mid,borderRadius:8,padding:"10px 14px",border:"1px solid "+s.rule}}, h("span",{style:{fontSize:17}},isPDF(f)?"📄":isImg(f)?"🖼️":"📋"), h("span",{style:{flex:1,fontSize:13,color:"#cbd5e1",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"}},f.name), h("span",{style:{fontSize:11,color:"#475569"}},(f.size/1024).toFixed(0)+" KB"), h("button",{onClick:function(){setFiles(function(p){return p.filter(function(x){return x.name!==f.name;});});setLimitWarn(null);}, style:{background:"none",border:"none",color:"#475569",cursor:"pointer",fontSize:16,padding:0}},"×") ); }) ) ), h("div",{style:{display:"flex",flexDirection:"column",gap:16}}, h("div",null, h("label",{style:{fontSize:12,fontWeight:600,color:"#94a3b8",textTransform:"uppercase",letterSpacing:".08em"}},"Reviewer Notes"), h("textarea",{value:notes,onChange:function(e){setNotes(e.target.value);},rows:5, placeholder:"Codes (default: ASHRAE 90.1-2022, NEC 2023, IPC 2021, IMC 2021), jurisdiction, project phase…", style:{width:"100%",marginTop:8,background:s.mid,border:"1px solid "+s.rule,borderRadius:8,padding:"10px 14px",color:s.wh,fontSize:13,outline:"none",resize:"vertical",boxSizing:"border-box"}}), h("div",{style:{fontSize:11,color:s.mu,marginTop:4}},"Specify a different code edition or jurisdiction and the AI will apply it.") ), h("div",{style:{background:"#131720",borderRadius:10,padding:16,border:"1px solid "+s.rule}}, h("div",{style:{fontSize:11,fontWeight:700,color:s.mu,textTransform:"uppercase",letterSpacing:".08em",marginBottom:12}},"Checks performed"), [["🌬️","Mechanical","Duct sizing, equipment schedules, airflow balance, clearances"], ["⚡","Electrical","Panel loading, wire sizing, LPD compliance, arc flash, disconnects"], ["💧","Plumbing","Pipe sizing (DFUs), venting, cleanouts, backflow, trap primers"], ["🔗","Coordination","Ceiling/wall conflicts, structural penetrations, RCP coordination"] ].map(function(item){ return h("div",{key:item[1],style:{display:"flex",gap:10,marginBottom:10,fontSize:12,color:"#94a3b8",alignItems:"flex-start"}}, h("span",{style:{flexShrink:0,marginTop:1}},item[0]), h("div",null,h("strong",{style:{color:"#cbd5e1"}},item[1])," — "+item[2]) ); }), h("div",{style:{borderTop:"1px solid "+s.rule,marginTop:10,paddingTop:10,fontSize:11,color:s.mu}},"Default codes: ASHRAE 90.1-2022 · NEC 2023 · IPC 2021 · IMC 2021") ), h("button",{onClick:analyze,disabled:!files.length||busy, style:{padding:14,borderRadius:10,border:"none",background:!files.length||busy?"#1e2535":"linear-gradient(135deg,#3b82f6,#06b6d4)", color:!files.length||busy?"#475569":"#fff",fontWeight:700,fontSize:15,cursor:!files.length||busy?"not-allowed":"pointer"}}, busy?"Analyzing...":"Review "+(files.length||"")+" Document"+(files.length!==1?"s":"") ), busy&&h("div",{style:{textAlign:"center"}}, h("div",{style:{fontSize:12,color:s.mu,marginBottom:8}},prog), h("div",{style:{height:3,background:"#1e2535",borderRadius:2,overflow:"hidden"}}, h("div",{style:{height:"100%",width:"60%",background:"linear-gradient(90deg,#3b82f6,#06b6d4)",borderRadius:2,animation:"slide 1.5s infinite"}}) ) ), err&&h("div",{style:{background:"#1c1215",border:"1px solid #7f1d1d",borderRadius:8,padding:12,fontSize:13,color:"#f87171"}},"⚠️ "+err) ) ); } else { var riskCfg = RISK[result.riskLevel]||{}; inner = h("div",null, h("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",marginBottom:24,flexWrap:"wrap",gap:12}}, h("div",null, h("div",{style:{fontSize:20,fontWeight:700,color:s.wh}},proj||"Review Complete"), h("div",{style:{fontSize:13,color:s.mu,marginTop:2}}, result.issueCount+" issues · "+files.length+" doc"+(files.length!==1?"s":""), result.codesApplied&&result.codesApplied.length?h("span",{style:{marginLeft:8,fontSize:11,color:s.mu}},"· "+result.codesApplied.join(", ")):null ) ), h("div",{style:{display:"flex",gap:10,flexWrap:"wrap"}}, HAS_EXCEL ?h("button",{onClick:dlXLSX,style:{display:"flex",alignItems:"center",gap:7,background:"#14532d",border:"1px solid #166534",borderRadius:8,padding:"8px 16px",color:"#86efac",fontSize:13,cursor:"pointer",fontWeight:600}},"📊 Excel") :h("div",{title:"Excel export requires Single User or Team plan",style:{display:"flex",alignItems:"center",gap:7,background:"#1a1f2e",border:"1px solid #2d3748",borderRadius:8,padding:"8px 16px",color:"#475569",fontSize:13}},"📊 Excel — upgrade"), h("button",{onClick:dlPDF,style:{display:"flex",alignItems:"center",gap:7,background:"#1e3a5f",border:"1px solid #1d4ed8",borderRadius:8,padding:"8px 16px",color:"#93c5fd",fontSize:13,cursor:"pointer",fontWeight:600}},"📄 PDF"), h("button",{onClick:function(){setResult(null);setFiles([]);setNotes("");setProj("");setLimitWarn(null);}, style:{background:s.mid,border:"1px solid "+s.rule,borderRadius:8,padding:"8px 16px",color:"#94a3b8",fontSize:13,cursor:"pointer"}},"← New review") ) ), h("div",{style:{display:"grid",gridTemplateColumns:"repeat(4,1fr)",gap:12,marginBottom:24}}, h("div",{style:{background:(riskCfg.color||"#888")+"11",border:"1px solid "+(riskCfg.color||"#888")+"40",borderRadius:10,padding:16}}, h("div",{style:{fontSize:11,color:s.mu,fontWeight:600,textTransform:"uppercase",marginBottom:6}},"Overall Risk"), h("div",{style:{fontSize:18,fontWeight:800,color:riskCfg.color||"#888"}},riskCfg.label||result.riskLevel) ), ["Critical","Major","Minor"].map(function(sv){ return h("div",{key:sv,style:{background:"#131720",border:"1px solid "+(SEV[sv].color)+"30",borderRadius:10,padding:16}}, h("div",{style:{fontSize:11,color:s.mu,fontWeight:600,textTransform:"uppercase",marginBottom:6}},sv), h("div",{style:{fontSize:24,fontWeight:800,color:SEV[sv].color}},sc[sv]||0) ); }) ), h("div",{style:{display:"flex",gap:10,marginBottom:20,flexWrap:"wrap"}}, Object.keys(dc).map(function(d){ return h("div",{key:d,style:{background:s.mid,border:"1px solid "+s.rule,borderRadius:8,padding:"7px 12px",fontSize:13,color:"#94a3b8",display:"flex",alignItems:"center",gap:6}}, (DI[d]||"")+" ",h("strong",{style:{color:s.wh}},d),": "+dc[d]+" issue"+(dc[d]!==1?"s":"") ); }) ), h("div",{style:{background:"#131720",border:"1px solid "+s.rule,borderRadius:10,padding:16,marginBottom:24}}, h("div",{style:{fontSize:11,fontWeight:600,color:s.mu,textTransform:"uppercase",marginBottom:8,letterSpacing:".08em"}},"Executive Summary"), h("p",{style:{fontSize:14,color:"#cbd5e1",margin:0,lineHeight:1.65}},result.summary) ), h("div",{style:{display:"flex",gap:8,marginBottom:16,flexWrap:"wrap"}}, ["All","Mechanical","Electrical","Plumbing","Coordination"].map(function(d){ return h("button",{key:d,onClick:function(){setFDisc(d);}, style:{padding:"5px 12px",borderRadius:6,border:"1px solid",borderColor:fDisc===d?"#3b82f6":s.rule,background:fDisc===d?"#1e3a5f":"#131720",color:fDisc===d?"#93c5fd":s.mu,fontSize:12,cursor:"pointer",fontWeight:500}},d); }), ["All","Critical","Major","Minor","Advisory"].map(function(sv){ var sc2=SEV[sv]||{}; return h("button",{key:sv,onClick:function(){setFSev(sv);}, style:{padding:"5px 12px",borderRadius:6,border:"1px solid",borderColor:fSev===sv?(sc2.color||"#3b82f6"):s.rule,background:fSev===sv?"#1a1f2e":"#131720",color:fSev===sv?(sc2.color||"#93c5fd"):s.mu,fontSize:12,cursor:"pointer",fontWeight:500}},sv); }) ), h("div",{style:{display:"flex",flexDirection:"column",gap:10,marginBottom:32}}, filtered.length===0&&h("div",{style:{textAlign:"center",padding:40,color:"#475569",fontSize:14}},"No issues match the current filters."), filtered.map(function(issue){ var cfg2=SEV[issue.severity]||SEV.Advisory; var isO=expId===issue.id; return h("div",{key:issue.id,style:{background:"#131720",border:"1px solid "+(isO?cfg2.color+"50":s.rule),borderRadius:10,overflow:"hidden",transition:"border-color .2s"}}, h("div",{onClick:function(){setExpId(isO?null:issue.id);},style:{display:"flex",alignItems:"center",gap:12,padding:"13px 16px",cursor:"pointer"}}, h("span",{style:{fontSize:17}},DI[issue.discipline]||""), h("span",{style:{background:cfg2.bg,color:cfg2.color,border:"1px solid "+cfg2.border,borderRadius:4,padding:"2px 8px",fontSize:11,fontWeight:700}},issue.severity), h("span",{style:{flex:1,fontSize:14,fontWeight:600,color:s.wh}},issue.title), h("span",{style:{fontSize:11,color:"#475569",background:s.mid,borderRadius:4,padding:"2px 8px"}},issue.id), h("span",{style:{color:"#475569",fontSize:14}},isO?"▲":"▼") ), isO&&h("div",{style:{padding:"0 16px 16px",borderTop:"1px solid "+s.rule}}, h("div",{style:{display:"grid",gridTemplateColumns:"1fr 1fr",gap:16,marginTop:16}}, h("div",null, h("div",{style:{fontSize:11,color:s.mu,fontWeight:600,textTransform:"uppercase",marginBottom:6}},"Description"), h("p",{style:{fontSize:13,color:"#cbd5e1",margin:0,lineHeight:1.6}},issue.description) ), h("div",null, h("div",{style:{fontSize:11,color:s.mu,fontWeight:600,textTransform:"uppercase",marginBottom:6}},"Recommendation"), h("p",{style:{fontSize:13,color:"#cbd5e1",margin:0,lineHeight:1.6}},issue.recommendation) ) ), h("div",{style:{display:"flex",gap:24,marginTop:12,flexWrap:"wrap"}}, h("div",null,h("span",{style:{fontSize:11,color:s.mu,fontWeight:600}},"LOCATION: "),h("span",{style:{fontSize:12,color:"#94a3b8"}},issue.location)), issue.codeReference&&issue.codeReference!=="N/A"&&h("div",null,h("span",{style:{fontSize:11,color:s.mu,fontWeight:600}},"CODE: "),h("span",{style:{fontSize:12,color:"#3b82f6",fontWeight:600}},issue.codeReference)) ) ) ); }) ), h("div",{style:{display:"grid",gridTemplateColumns:"1fr 1fr",gap:20}}, result.positiveFindings&&result.positiveFindings.length>0&&h("div",{style:{background:"#0f1f12",border:"1px solid #14532d",borderRadius:10,padding:16}}, h("div",{style:{fontSize:11,fontWeight:700,color:"#22c55e",textTransform:"uppercase",marginBottom:12,letterSpacing:".08em"}},"✓ Positive Findings"), result.positiveFindings.map(function(p2,i){ return h("div",{key:i,style:{fontSize:13,color:"#86efac",marginBottom:8,paddingLeft:12,borderLeft:"2px solid #166534",lineHeight:1.5}},p2); }) ), result.nextSteps&&result.nextSteps.length>0&&h("div",{style:{background:"#12131f",border:"1px solid #1e3a5f",borderRadius:10,padding:16}}, h("div",{style:{fontSize:11,fontWeight:700,color:"#3b82f6",textTransform:"uppercase",marginBottom:12,letterSpacing:".08em"}},"→ Prioritized Next Steps"), result.nextSteps.map(function(step,i){ return h("div",{key:i,style:{display:"flex",gap:10,fontSize:13,color:"#93c5fd",marginBottom:8,lineHeight:1.5}}, h("span",{style:{color:"#1d4ed8",fontWeight:700,minWidth:18,flexShrink:0}},(i+1)+"."),step ); }) ) ), h("div",{style:{marginTop:32,padding:"12px 16px",background:"#131720",border:"1px solid "+s.rule,borderRadius:8,fontSize:12,color:s.mu,lineHeight:1.6}}, "⚠️ MEPCheck AI is an AI-assisted QA/QC tool. Findings are for review and coordination purposes. They do not replace the professional judgment or stamp of the engineer of record." ) ); } children.push(h("div",{key:"main",style:{maxWidth:1100,margin:"0 auto",padding:"28px 24px"}},inner)); children.push(h("style",{key:"style"},"@keyframes slide{0%{transform:translateX(-100%)}100%{transform:translateX(250%)}}")); return h("div",{style:{fontFamily:"'Inter',system-ui,sans-serif",background:s.ink,minHeight:"100vh",color:s.wh}},children); } window.mountTool = function(cfg) { try { window.MEPCHECK_API_URL = window.MEPCHECK_WORKER_URL || "https://api.anthropic.com/v1/messages"; var root = document.getElementById("tool-root"); if (!root) { console.error("[MEPCheck] #tool-root not found"); return; } console.log("[MEPCheck] Mounting tool with cfg:", cfg); if (root._reactRoot) { root._reactRoot.render(React.createElement(ToolApp, { cfg: cfg })); } else { root._reactRoot = ReactDOM.createRoot(root); root._reactRoot.render(React.createElement(ToolApp, { cfg: cfg })); } console.log("[MEPCheck] Tool mounted successfully"); } catch(e) { console.error("[MEPCheck] mountTool error:", e); var root2 = document.getElementById("tool-root"); if (root2) root2.innerHTML = '
⚠️ Tool error: ' + (e && e.message ? e.message : String(e)) + '

Open browser console (F12) for details.
'; } }; console.log("[MEPCheck] Tool script loaded OK. window.mountTool:", typeof window.mountTool); } catch(TOOL_INIT_ERR) { console.error("[MEPCheck] Tool script init error:", TOOL_INIT_ERR.message, TOOL_INIT_ERR); window.mountTool = function(cfg) { var root = document.getElementById("tool-root"); if (root) root.innerHTML = '
⚠️ Tool failed to initialise.

Error: ' + TOOL_INIT_ERR.message + '

Please report this error.
'; var ts = document.getElementById("tool-section"); if (ts) { ts.classList.add("visible"); document.body.style.overflow = "hidden"; } }; }