[{"data":1,"prerenderedAt":380},["ShallowReactive",2],{"navigation_docs_en":3,"-en-architecture-securite":78,"-en-architecture-securite-surround":375},[4,14,40,54,60,66,72],{"title":5,"path":6,"stem":7,"children":8},"The essentials","/en/proposition","en/1.proposition/1.index",[9,10],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"Your need, understood","/en/proposition/comprehension","en/1.proposition/2.comprehension",{"title":15,"path":16,"stem":17,"children":18},"Overview","/en/architecture","en/2.architecture/1.index",[19,20,24,28,32,36],{"title":15,"path":16,"stem":17},{"title":21,"path":22,"stem":23},"Technical choices","/en/architecture/stack","en/2.architecture/2.stack",{"title":25,"path":26,"stem":27},"Security & compliance","/en/architecture/securite","en/2.architecture/3.securite",{"title":29,"path":30,"stem":31},"The modules","/en/architecture/modules","en/2.architecture/4.modules",{"title":33,"path":34,"stem":35},"Partner integration","/en/architecture/partenaires","en/2.architecture/5.partenaires",{"title":37,"path":38,"stem":39},"Information system","/en/architecture/systeme-information","en/2.architecture/6.systeme-information",{"title":41,"path":42,"stem":43,"children":44},"The plan","/en/roadmap","en/4.roadmap/1.index",[45,46,50],{"title":41,"path":42,"stem":43},{"title":47,"path":48,"stem":49},"The method","/en/roadmap/methodologie","en/4.roadmap/2.methodologie",{"title":51,"path":52,"stem":53},"The budget","/en/roadmap/budget","en/4.roadmap/3.budget",{"title":55,"path":56,"stem":57,"children":58},"Vortex-Soft","/en/equipe","en/5.equipe/1.index",[59],{"title":55,"path":56,"stem":57},{"title":61,"path":62,"stem":63,"children":64},"Specification","/en/cdc","en/6.cdc/1.index",[65],{"title":61,"path":62,"stem":63},{"title":67,"path":68,"stem":69,"children":70},"Infrastructure","/en/infrastructure","en/7.infrastructure/1.index",[71],{"title":67,"path":68,"stem":69},{"title":73,"path":74,"stem":75,"children":76},"Mockups","/en/maquette","en/8.maquette/1.index",[77],{"title":73,"path":74,"stem":75},{"id":79,"title":25,"badge":80,"body":81,"category":80,"description":368,"extension":369,"links":80,"meta":370,"navigation":372,"path":26,"seo":373,"stem":27,"tags":80,"__hash__":374},"docs_en/en/2.architecture/3.securite.md",null,{"type":82,"value":83,"toc":359},"minimark",[84,93,98,115,122,126,129,137,144,148,175,179,201,204,208,239,243,246,249,318,325,329,355],[85,86,87,88,92],"p",{},"Security is designed into the data model, not bolted on at the end. In a financial system the question is not only “who can get in”, but ",[89,90,91],"strong",{},"“what can be proven six months later”",".",[94,95,97],"h2",{"id":96},"immutability-enforced-by-the-database-not-by-discipline","Immutability enforced by the database, not by discipline",[99,100,105],"pre",{"className":101,"code":102,"language":103,"meta":104,"style":104},"language-sql shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","REVOKE UPDATE, DELETE ON journal_entries, postings FROM amtm_app;\n","sql","",[106,107,108],"code",{"__ignoreMap":104},[109,110,113],"span",{"class":111,"line":112},"line",1,[109,114,102],{},[85,116,117,118,121],{},"An entry cannot be modified or deleted. Not because the code refrains — because ",[89,119,120],{},"the database refuses",". An application bug, a mishandled operation or a malicious action physically cannot corrupt history. A correction is a reversal: both the error and its correction stay visible.",[94,123,125],{"id":124},"hash-chained-audit-trail","Hash-chained audit trail",[85,127,128],{},"Every audit row embeds the hash of the previous one:",[99,130,135],{"className":131,"code":133,"language":134},[132],"language-text","hash = sha256( prev_hash ‖ seq ‖ timestamp ‖ actor ‖ action ‖ payload )\n","text",[106,136,133],{"__ignoreMap":104},[85,138,139,140,143],{},"Any after-the-fact modification of a row ",[89,141,142],{},"breaks the chain and becomes detectable",". An external auditor can verify the integrity of the whole history without trusting us, and without asking us for anything.",[94,145,147],{"id":146},"split-of-duties","Split of duties",[149,150,151,159,165,172],"ul",{},[152,153,154,155,158],"li",{},"Granular ",[89,156,157],{},"RBAC",": role × branch × ceiling. A teller only sees their own till.",[152,160,161,164],{},[89,162,163],{},"Whoever enters does not approve."," Above a configurable threshold, dual approval is mandatory.",[152,166,167,168,171],{},"Every account is ",[89,169,170],{},"named",". No shared logins, ever — that is the first weakness in this kind of operation.",[152,173,174],{},"Expiring sessions, remote forced logout, login log.",[94,176,178],{"id":177},"isolation-lives-in-the-database","Isolation lives in the database",[99,180,182],{"className":101,"code":181,"language":103,"meta":104,"style":104},"ALTER TABLE postings ENABLE ROW LEVEL SECURITY;\nCREATE POLICY tenant_isolation ON postings\n  USING (tenant_id = current_setting('app.tenant_id')::uuid);\n",[106,183,184,189,195],{"__ignoreMap":104},[109,185,186],{"class":111,"line":112},[109,187,188],{},"ALTER TABLE postings ENABLE ROW LEVEL SECURITY;\n",[109,190,192],{"class":111,"line":191},2,[109,193,194],{},"CREATE POLICY tenant_isolation ON postings\n",[109,196,198],{"class":111,"line":197},3,[109,199,200],{},"  USING (tenant_id = current_setting('app.tenant_id')::uuid);\n",[85,202,203],{},"Even if the application code gets it wrong, the database will not return another tenant's rows. That is what makes reselling to other sub-agents defensible to a third party.",[94,205,207],{"id":206},"kyc-aml","KYC / AML",[149,209,210,221,227,233],{},[152,211,212,215,216,220],{},[89,213,214],{},"Secondary identifiers mandatory at entry",": a name alone is not enough. Date of birth, nationality and identity document are what let you confirm ",[217,218,219],"em",{},"or clear"," a candidate, with a documented basis.",[152,222,223,226],{},[89,224,225],{},"Fuzzy matching"," on sanctions lists: phonetic, transliteration, aliases — exact-name matching misses too many true hits.",[152,228,229,232],{},[89,230,231],{},"Automatic rescreening"," of the existing base on every list update, not just a check at onboarding.",[152,234,235,238],{},[89,236,237],{},"Monitoring",": threshold rules, structuring detection, risk corridors, suspicious activity reports generated and tracked.",[94,240,242],{"id":241},"continuity","Continuity",[85,244,245],{},"TLS everywhere, encryption at rest for identity documents, secrets kept out of the code, WAL backups with point-in-time recovery.",[85,247,248],{},"These objectives are not intentions — they are quantified and committed in the proposal:",[250,251,252,268],"table",{},[253,254,255],"thead",{},[256,257,258,262,265],"tr",{},[259,260,261],"th",{},"Commitment",[259,263,264],{},"Value",[259,266,267],{},"What it means",[269,270,271,288,303],"tbody",{},[256,272,273,279,285],{},[274,275,276],"td",{},[89,277,278],{},"RPO",[274,280,281,282],{},"under ",[89,283,284],{},"5 minutes",[274,286,287],{},"How much data is lost at worst in a disaster. The standard for critical banking systems sits between one and five minutes.",[256,289,290,295,300],{},[274,291,292],{},[89,293,294],{},"RTO",[274,296,281,297],{},[89,298,299],{},"1 hour",[274,301,302],{},"Time before service resumes. Measured in a real drill, with the stopwatch handed to you.",[256,304,305,310,315],{},[274,306,307],{},[89,308,309],{},"Availability",[274,311,312],{},[89,313,314],{},"99.5 %",[274,316,317],{},"That is 3 h 39 of downtime tolerated per month. It is an error budget: it is spent, it is measured, and when exhausted we stop shipping features to restore reliability.",[319,320,321,324],"note",{},[89,322,323],{},"A backup never restored is not a backup."," The restore drill is tested and timed before go-live, and the result is handed to you in writing.",[94,326,328],{"id":327},"what-we-prove-before-launch","What we prove before launch",[149,330,331,337,343,349],{},[152,332,333,336],{},[89,334,335],{},"Penetration test"," report (OWASP methodology)",[152,338,339,342],{},[89,340,341],{},"Load test"," report",[152,344,345,348],{},[89,346,347],{},"Restore"," report: measured duration, verified data",[152,350,351,354],{},[89,352,353],{},"Audit-chain integrity"," verification on an acceptance dataset",[356,357,358],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":104,"searchDepth":191,"depth":191,"links":360},[361,362,363,364,365,366,367],{"id":96,"depth":191,"text":97},{"id":124,"depth":191,"text":125},{"id":146,"depth":191,"text":147},{"id":177,"depth":191,"text":178},{"id":206,"depth":191,"text":207},{"id":241,"depth":191,"text":242},{"id":327,"depth":191,"text":328},"Tamper-evident audit trail, split of duties, KYC/AML — the level your trade requires.","md",{"icon":371},"lucide:shield-check",true,{"title":25,"description":368},"WurNjySpbteEejTlp5wppAXODz0U2pQJmjKgdW8Yq7Q",[376,378],{"title":21,"path":22,"stem":23,"description":377,"children":-1},"Every technology justified by a constraint of your trade.",{"title":29,"path":30,"stem":31,"description":379,"children":-1},"The full functional coverage, family by family.",1787177558617]