💼 Fund & Investment Manager Compliance

AI-native compliance for PE, VC and Hedge Funds

From SEC/FCA regulatory tracking to portfolio-wide GRC monitoring — purpose-built for investment managers and their portfolio companies.

Covers: SEC · FCA · CFTC · SFDR · ISSB · Form ADV · Form PF · AML/KYC · ESG

AGENTIC AI ASSESSMENT

Run Fund Compliance Assessment

6 AI agents analyse your fund's compliance posture and generate a CCO-ready board report in under 90 seconds

Fund type:
ISSB S1/S2, SFDR, GRI and TCFD compliance. Collect ESG data across portfolio, generate LP-ready reports.
👥
LP Reporting Portal
Quarterly compliance and risk reports for limited partners. Secure LP access, auto-generated from portfolio data.
⚖️
Investment Adviser Compliance
Code of ethics, personal trading pre-clearance, conflict of interest tracking, Form ADV/PF calendar.
🔐
AML/KYC & Sanctions
LP onboarding KYC, beneficial ownership tracking, OFAC/UN/EU/UK HMT sanctions screening — FinCEN CDD Rule compliant.
🏦
Management Company Audit
Internal audit of the management company — fee calculations, carry waterfall, expense allocation, SOX controls.
📄 Document Review & Analysis
Upload fund documents for AI-powered compliance review
📂
Drop files here or click to browse
PDF, DOCX, XLSX, TXT · Max 25MB per file · Multiple files supported
📢 SEC Marketing Rule (Rule 206(4)-1) Compliance
Updated Jan 2026
Rule 206(4)-1 — effective November 2022 — governs all investment adviser marketing communications
📝 Marketing Material Reviewer

Paste marketing copy, pitch deck text, or website content below for review against all 7 key Marketing Rule criteria.

Will check: ✓ Performance data (gross vs net)  ✓ Testimonials & endorsements  ✓ Third-party ratings  ✓ Hypothetical performance  ✓ Cherry-picking prohibition  ✓ Promoter disqualification  ✓ Fair & balanced presentation
📊 Performance Presentation Checker
🗣️ Testimonial & Endorsement Compliance
Is the promoter compensated?
Disqualification check completed?
Required disclosure included?
✅ SEC Marketing Rule Requirements Checklist
Track implementation of all key Marketing Rule requirements
0%
📅 Regulatory Filing Calendar & Deadlines
Track all regulatory deadlines — colour-coded by urgency. Status saved locally.
FilingRegulatorNext DeadlineDays UntilStatusNotes
📊 GIPS® Performance Standards Compliance
CFA Institute Global Investment Performance Standards — 2020 edition
🏗️ GIPS Composite Builder
✅ GIPS Compliance Checklist
Mark each requirement's status
0%
📜 GIPS Claim of Compliance Statement Generator

Generate the standard GIPS claim of compliance statement ready to insert into marketing materials and composite presentations.

🔀 GIPS vs SEC Marketing Rule Crosswalk
RequirementGIPS 2020SEC Marketing RuleAlignment
Show net returnsRequiredRequired (Rule 206(4)-1(d)(1))✅ Aligned
Show gross returnsRequired alongside netMay show gross if net also shown✅ Aligned
1/5/10 year periods5-year minimum (or since inception)Required for RIA ads⚠️ Partial
BenchmarkRequired — must use appropriateMust not omit material info✅ Aligned
Hypothetical performanceClearly labelled, limited useStrict conditions apply✅ Aligned
Cherry-pickingAll fee-paying accounts must be includedProhibited — must be fair & balanced✅ Aligned
TestimonialsN/ANew rule — allowed with conditions— N/A for GIPS
VerificationEncouraged (not required)N/A— Different scope
⚖️ Code of Ethics & Personal Trading Compliance
Rule 17j-1 (Investment Companies) / Rule 204A-1 (Investment Advisers)
📋 Code of Ethics Builder
📈 Personal Trading Pre-clearance Checklist
Track implementation status
0%
📝 Access Person Declaration Template

Generate an annual access person holdings and transactions certification form ready to distribute to employees.

🔍 AML/CFT Programme Builder
Deadline: Jan 1, 2028
FinCEN Investment Adviser AML Rule — effective January 2028. Build your programme now to meet the deadline.
🏗️ AML Programme Builder
Required programme components — track your implementation
0%
🌳 SAR Decision Tree — Should I File a SAR?
🔍 KYC/CDD Investor Checklist

Track KYC/CDD completion status for each investor. Save per-investor checklists below.

Current investor KYC status
0%
👥 Investor Accreditation & Reg D Compliance
Verify accredited investor status under SEC Rule 501 and track Regulation D offering compliance
✅ Accreditation Verifier
Net worth (excl. primary residence) ≥ $1,000,000?
Annual income ≥ $200,000 (or $300,000 joint) last 2 years + this year?
Knowledgeable employee of the fund?
Holds Series 65, Series 82, or other qualifying licence?
📋 Reg D Filing Tracker
🎯 Mock SEC Examination Preparation
Based on 2026 SEC Division of Examinations Priority Examination Areas
📋 2026 SEC Exam Priority Checklist
Track readiness across all 2026 SEC exam priority areas
0%
Exam Readiness
📁 Document Request List (DRL) Simulator

Simulate a typical SEC examination document request list. Track what you have and where it's stored.

DRL Readiness Score: 0%
DocumentHave it?Where StoredLast Reviewed
🎤 Mock Exam AI Interviewer

AI plays the role of an SEC examiner and asks realistic questions about your compliance programme. Practice your responses.

Purpose-built for investment managers

The only GRC platform covering the full fund compliance lifecycle — from LP onboarding to portfolio exit.

🏢 Explore Portfolio Monitor 🔍 Run DD Assessment
'); w.document.close(); w.print(); } function escapeHtml(str) { return String(str).replace(/&/g,'&').replace(//g,'>'); } // ── Section 2: SEC Marketing Rule ──────────────────────────── async function reviewMarketingMaterial() { var text = document.getElementById('mktMaterialText').value.trim(); if (!text) { showFundToast('Please paste marketing content first'); return; } var btn = event.target; btn.disabled = true; btn.textContent = '⏳ Reviewing…'; try { var result = await callFundAIText( 'You are a senior SEC compliance attorney specialising in Rule 206(4)-1 (SEC Marketing Rule). Review the provided marketing material against each of the 7 key criteria. For each criterion, output: criterion name, PASS or FAIL or REVIEW NEEDED, the specific SEC rule reference, and your finding in 1-2 sentences. Format clearly with headers.', 'Marketing material to review:\n\n' + text ); (document.getElementById('mktReviewResult') || {}).innerHTML = '
' + escapeHtml(result) + '
'; } catch(e) { showFundToast('Error: ' + e.message); } finally { btn.disabled = false; btn.textContent = 'Review for Marketing Rule'; } } function checkPerfPresentation() { var gross = parseFloat(document.getElementById('perfGross').value); var net = parseFloat(document.getElementById('perfNet').value); var period = document.getElementById('perfPeriod').value; var benchmark = document.getElementById('perfBenchmark').value.trim(); var fees = document.getElementById('perfFeeBasis').value.trim(); var checks = []; checks.push({ label: 'Gross return provided', pass: !isNaN(gross), rule: 'Rule 206(4)-1(d)(1)' }); checks.push({ label: 'Net return provided', pass: !isNaN(net), rule: 'Rule 206(4)-1(d)(1) — REQUIRED' }); checks.push({ label: 'Both gross and net shown', pass: !isNaN(gross) && !isNaN(net), rule: 'Rule 206(4)-1(d)(1)' }); checks.push({ label: 'Net ≤ Gross (deducting fees reduces returns)', pass: !isNaN(gross) && !isNaN(net) && net <= gross, rule: 'Logical consistency check' }); checks.push({ label: 'Time period specified', pass: !!period, rule: 'Rule 206(4)-1(d)(7)' }); checks.push({ label: '1, 5, and 10-year periods shown (or since inception)', pass: period === '10yr' || period === 'inception', rule: 'Rule 206(4)-1(d)(7) — RIA requirement', warn: period !== '10yr' && period !== 'inception' }); checks.push({ label: 'Benchmark identified', pass: !!benchmark, rule: 'Rule 206(4)-1(d)(3)' }); checks.push({ label: 'Fee basis disclosed', pass: !!fees, rule: 'Rule 206(4)-1(d)(1)' }); var html = checks.map(function(c) { var icon = c.warn ? '⚠️' : c.pass ? '✅' : '❌'; var color = c.warn ? '#d97706' : c.pass ? '#059669' : '#dc2626'; return '
' + '' + icon + '' + '
' + c.label + '
' + '
' + c.rule + '
'; }).join(''); (document.getElementById('perfCheckResult') || {}).innerHTML = '
' + html + '
'; } async function reviewTestimonial() { var comp = fcGetYN('testiComp'); var disq = fcGetYN('testiDisq'); var disc = fcGetYN('testiDisc'); var btn = event.target; btn.disabled = true; btn.textContent = '⏳ Reviewing…'; try { var result = await callFundAIText( 'You are an SEC Marketing Rule compliance expert. Assess testimonial/endorsement compliance and flag issues clearly.', 'Promoter compensated: ' + comp + '. Disqualification check done: ' + disq + '. Disclosure included: ' + disc + '. Identify all compliance issues and required actions under Rule 206(4)-1(b)(1) and (b)(2).' ); (document.getElementById('testiResult') || {}).innerHTML = '
' + escapeHtml(result) + '
'; } catch(e) { showFundToast('Error: ' + e.message); } finally { btn.disabled = false; btn.textContent = 'Review Endorsement Compliance'; } } // ── Checklist builder helper ────────────────────────────────── function buildFcChecklist(containerId, items, lsPrefix, pctId, barId) { var container = document.getElementById(containerId); if (!container) return; var saved = {}; try { saved = JSON.parse(localStorage.getItem(lsPrefix) || '{}'); } catch(e) {} var html = items.map(function(item, i) { var group = item.group; var label = item.label || item; var state = saved[i] || 'none'; var prefix = group ? '
' + group + '
' : ''; return prefix + '
' + '' + label + '' + '
' + '' + '' + '' + '
'; }).join(''); container.innerHTML = html; updateChecklistPct(containerId, items.length, lsPrefix, pctId, barId, saved); } function setChecklistState(containerId, idx, state, lsPrefix, pctId, barId) { var saved = {}; try { saved = JSON.parse(localStorage.getItem(lsPrefix) || '{}'); } catch(e) {} saved[idx] = state; localStorage.setItem(lsPrefix, JSON.stringify(saved)); var btns = document.querySelectorAll('#' + containerId + '-item-' + idx + ' .fc-status-btn'); btns.forEach(function(b) { b.className = 'fc-status-btn'; }); if (state === 'done') btns[0].classList.add('done'); else if (state === 'inprog') btns[1].classList.add('inprog'); var total = document.querySelectorAll('#' + containerId + ' .fc-checklist-item').length; updateChecklistPct(containerId, total, lsPrefix, pctId, barId, saved); } function updateChecklistPct(containerId, total, lsPrefix, pctId, barId, saved) { var done = Object.values(saved).filter(function(v) { return v === 'done'; }).length; var pct = total > 0 ? Math.round((done / total) * 100) : 0; var pctEl = document.getElementById(pctId); if (pctEl) pctEl.textContent = pct + '%'; var barEl = document.getElementById(barId); if (barEl) barEl.style.width = pct + '%'; } // ── Marketing Rule Checklist ────────────────────────────────── var MKT_CHECKLIST = [ 'Written policies and procedures for marketing adopted and implemented', 'All marketing materials reviewed by compliance before use', 'Performance presentation shows both gross AND net returns', 'All performance periods (1, 5, 10 years or since inception) included', 'Hypothetical performance labelled and includes required disclosures', 'Testimonials/endorsements reviewed for Rule 206(4)-1(b)(1) compliance', 'Third-party ratings reviewed — no misleading presentation', 'Predecessor performance included with required disclosures', 'Related performance includes all accounts in strategy', 'Fair and balanced presentation — no cherry-picking', 'Promoter disqualification checks completed', 'Portfolio company performance disclosures reviewed' ]; function initMktChecklist() { buildFcChecklist('mktChecklist', MKT_CHECKLIST, 'assurai_fund_compliance_marketing', 'mktChecklistPct', 'mktChecklistBar'); } // ── Section 3: Regulatory Filing Calendar ──────────────────── var FC_FILINGS = [ { id:'adv', name:'Form ADV Annual Amendment', reg:'SEC', deadline:'2027-03-31', note:'Dec 31 fiscal year-end — due within 90 days' }, { id:'pf', name:'Form PF (Large HF Advisers)', reg:'SEC', deadline:'2026-08-31', note:'Quarterly — 60 days after quarter-end' }, { id:'13f', name:'Form 13F', reg:'SEC', deadline:'2026-08-14', note:'Quarterly — 45 days after quarter-end' }, { id:'npx', name:'Form N-PX (Proxy Voting)', reg:'SEC', deadline:'2026-08-31', note:'Annual — by August 31' }, { id:'crs', name:'Form CRS (Relationship Summary)', reg:'SEC', deadline:'2027-03-31', note:'Annual update with Form ADV' }, { id:'aml', name:'AML/CFT Programme (FinCEN)', reg:'FinCEN', deadline:'2028-01-01', note:'⚠️ Deadline Extended from 2026', badge:'Deadline Extended' }, { id:'cpopqr', name:'CFTC Form CPO-PQR', reg:'CFTC', deadline:'2026-08-31', note:'Quarterly — see CFTC schedule' }, { id:'fca_aifmd', name:'FCA AIFMD Reporting', reg:'FCA', deadline:'2026-09-30', note:'Quarterly/Annual per fund size' }, { id:'esma_aifmd', name:'ESMA AIFMD/UCITS Reporting', reg:'ESMA', deadline:'2026-09-30', note:'Quarterly/Annual per fund size' } ]; function initFilingCalendar() { var tbody = document.getElementById('calendarBody'); if (!tbody) return; var today = new Date(); var saved = {}; try { saved = JSON.parse(localStorage.getItem('assurai_fund_calendar') || '{}'); } catch(e) {} tbody.innerHTML = FC_FILINGS.map(function(f) { var dl = new Date(f.deadline); var days = Math.round((dl - today) / 86400000); var daysCls = days < 30 ? 'fc-days-red' : days < 60 ? 'fc-days-amber' : 'fc-days-green'; var daysLabel = days < 0 ? 'OVERDUE (' + Math.abs(days) + 'd)' : days + ' days'; var status = saved[f.id] || 'pending'; var badgeHtml = f.badge ? '' + f.badge + '' : ''; return '' + '
' + f.name + badgeHtml + '
' + f.note + '
' + '' + f.reg + '' + '' + dl.toLocaleDateString('en-GB', {day:'numeric',month:'short',year:'numeric'}) + '' + '' + daysLabel + '' + '' + '
' + '' + '' + '
' + '' + '' + ''; }).join(''); } function setCalStatus(id, status) { var saved = {}; try { saved = JSON.parse(localStorage.getItem('assurai_fund_calendar') || '{}'); } catch(e) {} saved[id] = status; localStorage.setItem('assurai_fund_calendar', JSON.stringify(saved)); initFilingCalendar(); } function saveCalNote(id, note) { var saved = {}; try { saved = JSON.parse(localStorage.getItem('assurai_fund_calendar') || '{}'); } catch(e) {} saved[id + '_note'] = note; localStorage.setItem('assurai_fund_calendar', JSON.stringify(saved)); } function filterCalendar(filter) { var today = new Date(); var rows = document.querySelectorAll('#calendarBody tr'); rows.forEach(function(row, i) { var filing = FC_FILINGS[i]; if (!filing) return; var dl = new Date(filing.deadline); var days = Math.round((dl - today) / 86400000); var show = filter === 'all' || (filter === 'SEC' && filing.reg === 'SEC') || (filter === 'upcoming30' && days >= 0 && days <= 30) || (filter === 'upcoming60' && days >= 0 && days <= 60); row.style.display = show ? '' : 'none'; }); } // ── Section 4: GIPS ─────────────────────────────────────────── var GIPS_CHECKLIST = [ 'Composite definition documented and available', 'All fee-paying discretionary accounts included in composite', 'Gross and net-of-fees returns calculated', 'Time-weighted returns (TWR) methodology used', 'Benchmark defined, consistent, and appropriate', 'Dispersion measure calculated and disclosed', '5-year minimum performance history (or since inception)', 'Annual composite presentation prepared', 'GIPS claim of compliance statement included in materials', 'Firm-wide GIPS compliance confirmed', 'GIPS verification engagement in place', 'Marketing materials reviewed for GIPS compliance' ]; function initGipsChecklist() { buildFcChecklist('gipsChecklist', GIPS_CHECKLIST, 'assurai_fund_compliance_gips', 'gipsChecklistPct', 'gipsChecklistBar'); } async function generateGIPSDescription() { var name = document.getElementById('gipsCompName').value; var strat = document.getElementById('gipsStrategy').value; var bench = document.getElementById('gipsBenchmark').value; var inception = document.getElementById('gipsInception').value; var fees = document.getElementById('gipsFees').value; if (!name || !strat) { showFundToast('Please enter composite name and strategy description'); return; } var btn = event.target; btn.disabled = true; btn.textContent = '⏳ Generating…'; try { var result = await callFundAIText( 'You are a GIPS 2020 compliance expert. Write a GIPS-compliant composite description ready to include in a GIPS composite presentation. It must include: composite name, strategy description, composite creation date, benchmark, and key investment process elements. Language must comply with GIPS 2020 requirements.', 'Composite name: ' + name + '\nStrategy: ' + strat + '\nBenchmark: ' + bench + '\nInception: ' + inception + '\nFees: ' + fees ); (document.getElementById('gipsDescResult') || {}).innerHTML = '
GIPS-COMPLIANT COMPOSITE DESCRIPTION
' + escapeHtml(result) + '
'; } catch(e) { showFundToast('Error: ' + e.message); } finally { btn.disabled = false; btn.textContent = 'Generate GIPS-Compliant Description'; } } async function generateGIPSClaim() { var firm = document.getElementById('gipsFirmName').value.trim(); if (!firm) { showFundToast('Please enter your firm name'); return; } var btn = event.target; btn.disabled = true; btn.textContent = '⏳ Generating…'; try { var result = await callFundAIText( 'You are a GIPS 2020 compliance expert. Generate the standard GIPS claim of compliance statement for the firm. Follow the exact GIPS 2020 required language.', 'Firm name: ' + firm + '. Generate the required GIPS 2020 claim of compliance statement.' ); (document.getElementById('gipsClaimResult') || {}).innerHTML = '
GIPS CLAIM OF COMPLIANCE STATEMENT
' + escapeHtml(result) + '
'; } catch(e) { showFundToast('Error: ' + e.message); } finally { btn.disabled = false; btn.textContent = 'Generate GIPS Claim Statement'; } } // ── Section 5: Code of Ethics ───────────────────────────────── var ETHICS_CHECKLIST = [ 'Pre-clearance policy in place for all reportable securities', 'Blackout period defined (typically trades restricted during portfolio trading)', 'Access person list maintained and updated quarterly', '60-day short-term trading ban implemented', 'IPO and private placement ban (or pre-clearance) in place', 'Quarterly transaction reporting by access persons', 'Annual holdings certification by access persons' ]; function initEthicsChecklist() { buildFcChecklist('ethicsChecklist', ETHICS_CHECKLIST, 'assurai_fund_compliance_ethics', 'ethicsChecklistPct', 'ethicsChecklistBar'); } async function generateCodeOfEthics() { var fundType = document.getElementById('ethicsFundType').value; var jurisdiction = document.getElementById('ethicsJurisdiction').value; var btn = event.target; btn.disabled = true; btn.textContent = '⏳ Generating…'; try { var result = await callFundAIText( 'You are a compliance attorney drafting a Code of Ethics for an investment fund. Create a comprehensive, board-approved Code of Ethics covering: personal securities trading, pre-clearance requirements, reportable securities, access persons, blackout periods, short-term trading prohibition, IPO/private placement restrictions, reporting requirements, annual certification, and sanctions for non-compliance.', 'Fund type: ' + fundType + '. Regulatory jurisdiction: ' + jurisdiction + '. Generate a complete, professional Code of Ethics.' ); (document.getElementById('ethicsResult') || {}).innerHTML = '
CODE OF ETHICS — ' + fundType + ' (' + jurisdiction + ')
' + escapeHtml(result) + '
'; } catch(e) { showFundToast('Error: ' + e.message); } finally { btn.disabled = false; btn.textContent = 'Generate Code of Ethics'; } } async function generateAccessPersonForm() { var firm = document.getElementById('accessPersonFirm').value.trim() || 'the Firm'; var btn = event.target; btn.disabled = true; btn.textContent = '⏳ Generating…'; try { var result = await callFundAIText( 'You are a compliance attorney. Draft an Annual Access Person Holdings and Transactions Certification Form for an investment adviser. The form must comply with Rule 204A-1 requirements and include: certification of securities holdings, disclosure of conflicts, annual training acknowledgement, and signature block.', 'Firm name: ' + firm + '. Generate the annual access person certification form.' ); (document.getElementById('accessPersonResult') || {}).innerHTML = '
ACCESS PERSON ANNUAL CERTIFICATION FORM
' + escapeHtml(result) + '
'; } catch(e) { showFundToast('Error: ' + e.message); } finally { btn.disabled = false; btn.textContent = 'Generate Access Person Certification Form'; } } // ── Section 6: AML/CFT ──────────────────────────────────────── var AML_CHECKLIST = [ 'Written AML/CFT policies and procedures adopted', 'Designated AML Compliance Officer appointed', 'Employee AML training programme implemented', 'Independent testing/audit of AML programme conducted', 'Customer Identification Programme (CIP) established', 'Suspicious Activity Report (SAR) filing procedures in place', 'Customer Due Diligence (CDD) procedures implemented', 'Beneficial ownership verification (>25% stake) in place', 'PEP and sanctions screening procedure established', 'Recordkeeping policy (minimum 5 years) documented' ]; function initAmlChecklist() { buildFcChecklist('amlChecklist', AML_CHECKLIST, 'assurai_fund_compliance_aml', 'amlChecklistPct', 'amlChecklistBar'); } async function generateAMLPolicy() { var btn = event.target; btn.disabled = true; btn.textContent = '⏳ Generating…'; try { var result = await callFundAIText( 'You are an AML compliance expert and former FinCEN examiner. Draft a comprehensive AML/CFT Policy Framework for an investment adviser, meeting all FinCEN requirements for the 2028 Investment Adviser AML Rule. Include all 4 required programme pillars: policies, compliance officer, training, and independent testing. Also include CIP, CDD, SAR procedures, and recordkeeping policy.', 'Generate a complete AML/CFT Policy Framework for a registered investment adviser subject to the FinCEN Investment Adviser AML Rule.' ); (document.getElementById('amlPolicyResult') || {}).innerHTML = '
AML/CFT POLICY FRAMEWORK
' + escapeHtml(result) + '
'; } catch(e) { showFundToast('Error: ' + e.message); } finally { btn.disabled = false; btn.textContent = 'Generate AML Policy Framework'; } } // SAR Decision Tree var sarStep = 0; function initSARDecisionTree() { sarStep = 0; renderSARStep(); } function renderSARStep() { var el = document.getElementById('sarDecisionTree'); if (!el) return; var steps = [ { q: 'Do you have knowledge of, or reason to suspect, that a transaction involves funds derived from illegal activity or is designed to evade BSA reporting requirements?', yes: 1, no: 'no-file', yesLabel: 'Yes', noLabel: 'No — Proceed normally' }, { q: 'Does the transaction involve $5,000 or more (or involves a pattern of transactions)?', yes: 2, no: 'seek-advice', yesLabel: 'Yes ($5,000+)', noLabel: 'No (below threshold)' }, { q: 'Has law enforcement asked you to delay SAR filing?', yes: 'delay-le', no: 'file', yesLabel: 'Yes — LE requested delay', noLabel: 'No — File normally' } ]; if (sarStep >= 0 && sarStep < steps.length) { var s = steps[sarStep]; el.innerHTML = '
' + '
STEP ' + (sarStep+1) + ' OF 3
' + '
' + s.q + '
' + '
' + '' + '' + '
'; } } function sarAnswer(ans, step) { var next = ans === 'yes' ? step.yes : step.no; if (typeof next === 'number') { sarStep = next; renderSARStep(); return; } var outcomes = { 'file': { icon:'🔴', title:'FILE SAR', color:'#dc2626', text:'You are required to file a SAR with FinCEN within 30 days of detection (60 days if no known suspect). Do not notify the subject. Maintain SAR confidentiality.' }, 'no-file': { icon:'✅', title:'DO NOT FILE SAR', color:'#059669', text:'Based on your responses, SAR filing is not required at this time. Document your analysis and continue normal monitoring.' }, 'seek-advice': { icon:'⚠️', title:'SEEK LEGAL ADVICE', color:'#d97706', text:'The transaction amount is below the $5,000 BSA SAR threshold, but you may still have obligations under other laws. Consult your AML compliance officer or legal counsel.' }, 'delay-le': { icon:'🔵', title:'DELAY PER LAW ENFORCEMENT', color:'#0057ff', text:'Delay SAR filing per law enforcement instruction. Document the LE request and the agreed delay period. File SAR when the delay period expires or LE advises filing.' } }; var o = outcomes[next]; (document.getElementById('sarDecisionTree') || {}).innerHTML = '
' + '
' + o.icon + '
' + '
' + o.title + '
' + '
' + o.text + '
' + '' + '
'; } var KYC_CHECKLIST = [ 'Identity verification documents obtained and verified', 'Beneficial ownership identified (>25% equity stake)', 'Source of funds and source of wealth documented', 'PEP (Politically Exposed Person) screening completed', 'Sanctions screening — OFAC, UN, EU lists checked', 'Ongoing monitoring programme in place', 'Risk rating assigned (Low/Medium/High)' ]; function initKycChecklist() { buildFcChecklist('kycChecklist', KYC_CHECKLIST, 'assurai_fund_compliance_kyc', 'kycChecklistPct', 'kycChecklistBar'); } // ── Section 7: Accreditation ────────────────────────────────── function fcSetAccType(type) { (document.getElementById('accIndividualQ') || {}).style.display = type === 'individual' ? '' : 'none'; (document.getElementById('accEntityQ') || {}).style.display = type === 'entity' ? '' : 'none'; document.getElementById('accTypeInd').classList.toggle('active', type === 'individual'); document.getElementById('accTypeEnt').classList.toggle('active', type === 'entity'); (document.getElementById('accResult') || {}).innerHTML = ''; } function checkAccreditation() { var isIndividual = document.getElementById('accIndividualQ').style.display !== 'none'; var accredited = false; var needsVerification = false; if (isIndividual) { var netWorth = fcGetYN('accNetWorth') === 'Y'; var income = fcGetYN('accIncome') === 'Y'; var knowledge = fcGetYN('accKnowledge') === 'Y'; var licence = fcGetYN('accLicence') === 'Y'; accredited = netWorth || income || knowledge || licence; } else { var aum = fcGetYN('accAUM') === 'Y'; var allOwners = fcGetYN('accAllOwners') === 'Y'; var institutional = fcGetYN('accInstitutional') === 'Y'; accredited = aum || allOwners || institutional; needsVerification = !accredited; } var result, css; if (accredited) { result = '✅ Accredited Investor — This investor appears to meet the accredited investor criteria under SEC Rule 501 of Regulation D.'; css = 'fc-result-compliant'; } else if (needsVerification) { result = '⚠️ Verify Further — Investor does not clearly meet standard accredited investor thresholds. Consult counsel to determine if any additional categories apply.'; css = 'fc-result-issues'; } else { result = '❌ Not Accredited — Based on the information provided, this investor does not appear to qualify as an accredited investor. They cannot participate in the offering.'; css = 'fc-result-noncompliant'; } (document.getElementById('accResult') || {}).innerHTML = '
' + result + '
This tool provides guidance only. Consult qualified legal counsel for final accreditation determinations.
'; } function calcRegDDeadline() { var firstSale = document.getElementById('regdFirstSale').value; if (!firstSale) return; var saleDate = new Date(firstSale); var deadline = new Date(saleDate.getTime() + 15 * 86400000); var today = new Date(); var daysLeft = Math.round((deadline - today) / 86400000); (document.getElementById('regdDeadlineDate') || {}).textContent = deadline.toLocaleDateString('en-GB', {weekday:'long', day:'numeric', month:'long', year:'numeric'}); (document.getElementById('regdDeadlineDays') || {}).textContent = daysLeft > 0 ? daysLeft + ' days remaining' : 'OVERDUE by ' + Math.abs(daysLeft) + ' days'; (document.getElementById('regdDeadlinePanel') || {}).style.display = 'block'; } function saveRegDFiling() { var data = { fundName: document.getElementById('regdFundName').value, type: document.getElementById('regdType').value, firstSale: document.getElementById('regdFirstSale').value, amount: document.getElementById('regdAmount').value, investors: document.getElementById('regdInvestors').value, status: document.getElementById('regdStatus').value, savedAt: new Date().toISOString() }; localStorage.setItem('assurai_fund_regd_' + Date.now(), JSON.stringify(data)); (document.getElementById('regdSaveMsg') || {}).textContent = '✅ Saved'; setTimeout(function() { (document.getElementById('regdSaveMsg') || {}).textContent = ''; }, 3000); } // ── Section 8: Mock SEC Exam ────────────────────────────────── var EXAM_CHECKLIST_ITEMS = [ { group: '🔐 Cybersecurity', label: 'Written information security policy (WISP) in place' }, { group: null, label: 'Cyber incident response plan documented and tested' }, { group: null, label: 'Vendor/third-party risk management programme' }, { group: null, label: 'Penetration testing conducted annually' }, { group: null, label: 'Reg S-P privacy notices current and distributed' }, { group: '📢 Marketing Rule', label: 'Policies and procedures updated for new Marketing Rule' }, { group: null, label: 'All marketing materials reviewed pre-use' }, { group: null, label: 'Performance presentations compliant (gross+net)' }, { group: null, label: 'Testimonial/endorsement review procedures in place' }, { group: '🤖 AI Governance', label: 'AI use policy documented' }, { group: null, label: 'AI risk assessment completed for tools in use' }, { group: null, label: 'Human oversight procedures for AI outputs' }, { group: null, label: 'Vendor AI due diligence completed' }, { group: '🌱 ESG', label: 'ESG claims substantiated with evidence' }, { group: null, label: 'Policies consistent with ESG disclosures' }, { group: null, label: 'Greenwashing risk assessment completed' } ]; function initExamChecklist() { buildFcChecklist('examChecklist', EXAM_CHECKLIST_ITEMS, 'assurai_fund_compliance_exam', 'examChecklistPct', 'examChecklistBar'); } var DRL_ITEMS = [ 'Form ADV Part 1 and Part 2A/2B (current filing)', 'Code of Ethics and personal trading reports (last 12 months)', 'Compliance policies and procedures manual', 'Marketing materials review log and samples', 'Trade blotter and order management records', 'Expense allocation policy and calculations', 'Valuation policy and procedures', 'AML/CFT programme documentation', 'Business continuity and disaster recovery plan', 'LP/investor list and fund agreements', 'Employee training records and completion logs', 'Vendor management / third-party oversight records' ]; function initDRLTable() { var tbody = document.getElementById('drlTableBody'); if (!tbody) return; var saved = {}; try { saved = JSON.parse(localStorage.getItem('assurai_fund_drl') || '{}'); } catch(e) {} tbody.innerHTML = DRL_ITEMS.map(function(doc, i) { var status = saved['s_'+i] || 'N'; var location = saved['l_'+i] || ''; var reviewed = saved['r_'+i] || ''; return '' + '' + doc + '' + '' + '' + '' + '' + '' + ''; }).join(''); updateDRLScore(saved); } function saveDRLItem(idx, field, val) { var saved = {}; try { saved = JSON.parse(localStorage.getItem('assurai_fund_drl') || '{}'); } catch(e) {} saved[field+'_'+idx] = val; localStorage.setItem('assurai_fund_drl', JSON.stringify(saved)); updateDRLScore(saved); } function updateDRLScore(saved) { var yes = 0; DRL_ITEMS.forEach(function(d, i) { if (saved['s_'+i] === 'Y') yes++; }); var pct = Math.round((yes / DRL_ITEMS.length) * 100); var el = document.getElementById('drlScore'); if (el) el.textContent = pct + '%'; } var mockExamQuestions = []; var mockExamCurrentQ = 0; async function startMockExam() { var topic = document.getElementById('examTopic').value.trim() || 'SEC Marketing Rule'; var btn = event.target; btn.disabled = true; btn.textContent = '⏳ Loading…'; mockExamQuestions = []; mockExamCurrentQ = 0; (document.getElementById('mockExamChat') || {}).innerHTML = ''; (document.getElementById('mockExamAnswerWrap') || {}).style.display = 'none'; try { var result = await callFundAIText( 'You are an SEC OCIE examiner conducting a compliance examination. Your task is to ask three realistic, substantive examination questions about the firm\'s compliance programme in the specified area. Number them 1, 2, 3. Ask them all at once — the firm will answer one at a time.', 'Ask 3 realistic SEC examination questions about: ' + topic + '. These should be questions that an examiner would actually ask during an on-site examination.' ); mockExamQuestions = result; addMockExamMsg('examiner', '👔 SEC Examiner:

' + result.replace(/\n/g,'
') + '

Please answer Question 1 first.'); (document.getElementById('mockExamAnswerWrap') || {}).style.display = 'block'; mockExamCurrentQ = 1; } catch(e) { showFundToast('Error: ' + e.message); } finally { btn.disabled = false; btn.textContent = 'Start Mock Exam'; } } async function submitMockAnswer() { var answer = document.getElementById('mockExamAnswer').value.trim(); if (!answer) { showFundToast('Please provide an answer'); return; } addMockExamMsg('firm', '🏢 Your Answer (Q' + mockExamCurrentQ + '):
' + answer.replace(/\n/g,'
')); (document.getElementById('mockExamAnswer') || {}).value = ''; var btn = event.target; btn.disabled = true; btn.textContent = '⏳ Evaluating…'; try { var eval_result = await callFundAIText( 'You are an SEC examiner evaluating a compliance programme response. Provide constructive feedback: what was good, what was missing, what follow-up questions this would trigger, and what a strong answer would include. Be specific and realistic.', 'Question ' + mockExamCurrentQ + ' from exam about: ' + document.getElementById('examTopic').value + '\nFirm\'s answer: ' + answer ); addMockExamMsg('feedback', '📊 Examiner Feedback:
' + eval_result.replace(/\n/g,'
')); if (mockExamCurrentQ < 3) { mockExamCurrentQ++; addMockExamMsg('examiner', '👔 Please now answer Question ' + mockExamCurrentQ + '.'); } else { (document.getElementById('mockExamAnswerWrap') || {}).style.display = 'none'; addMockExamMsg('feedback', '✅ Mock examination complete. Review the feedback above to identify areas for improvement.'); } } catch(e) { showFundToast('Error: ' + e.message); } finally { btn.disabled = false; btn.textContent = 'Submit Answer'; } } function addMockExamMsg(type, html) { var chat = document.getElementById('mockExamChat'); var colors = { examiner:'#eff4ff', firm:'#f0fdf4', feedback:'#fffbeb' }; var div = document.createElement('div'); div.style.cssText = 'background:' + (colors[type]||'#f8fafc') + ';border:1px solid var(--border-s);border-radius:10px;padding:14px;font-size:13px;line-height:1.6;'; div.innerHTML = html; chat.appendChild(div); div.scrollIntoView({ behavior:'smooth', block:'nearest' }); } // ── Init all new sections on page load ──────────────────────── document.addEventListener('DOMContentLoaded', function() { initMktChecklist(); initFilingCalendar(); initGipsChecklist(); initEthicsChecklist(); initAmlChecklist(); initSARDecisionTree(); initKycChecklist(); initExamChecklist(); initDRLTable(); }); // ══════════════════════════════════════════════════════════════ // END NEW SECTION JS // ══════════════════════════════════════════════════════════════ async function exportFundReportWord() { var results = window.fundAssessmentResults; if (!results) { showFundToast('No results to export — run an assessment first'); return; } showFundToast('📄 Generating Word Report…', 8000); var r = results.report || {}; var dateStr = new Date().toLocaleDateString('en-GB', { day:'numeric', month:'long', year:'numeric' }); var score = r.overall_compliance_score || 75; var risk = r.risk_rating || 'Medium'; var html = ''; html += '

Fund Compliance Assessment Report

'; html += '

' + dateStr + ' · Generated by AssurAI · getassurai.com


'; html += '

Executive Summary

'; html += '

Compliance Score: ' + score + '/100  |  Risk Rating: ' + risk + '

'; html += '

' + fundSafeStr(r.executive_summary||'') + '

'; if ((r.critical_findings||[]).length) { html += '

Critical Findings

'; (r.critical_findings||[]).forEach(function(f) { html += '
'; html += '

' + fundSafeStr(f.finding||f) + '

'; if (f.recommendation) html += '

→ ' + fundSafeStr(f.recommendation) + '

'; html += '
'; }); } if ((r.immediate_actions||[]).length) { html += '

Immediate Actions

    '; (r.immediate_actions||[]).forEach(function(a){ html += '
  1. ' + fundSafeStr(a) + '
  2. '; }); html += '
'; } if (r.board_narrative) { html += '

Board Narrative

'; html += '

' + fundSafeStr(r.board_narrative) + '

'; } if ((r.compliance_calendar_highlights||[]).length) { html += '

Compliance Calendar

'; html += ''; (r.compliance_calendar_highlights||[]).forEach(function(c){ html += ''; }); html += '
ItemDue DatePriority
' + fundSafeStr(c.item||c) + '' + fundSafeStr(c.due_date||'') + '' + fundSafeStr(c.priority||'') + '
'; } html += '

This assessment was generated by AssurAI\'s 6-agent AI pipeline. All outputs should be reviewed by qualified compliance professionals. Visit getassurai.com

'; var blob = new Blob([html], { type: 'application/msword' }); var a = document.createElement('a'); a.href = URL.createObjectURL(blob); a.download = 'fund-compliance-report.doc'; document.body.appendChild(a); a.click(); document.body.removeChild(a); URL.revokeObjectURL(a.href); showFundToast('✅ Word Report downloaded!', 4000); }