diff --git a/examples/output-demo-pharma-mx/bom-spec.yaml b/examples/output-demo-pharma-mx/bom-spec.yaml new file mode 100644 index 0000000..d1dbb71 --- /dev/null +++ b/examples/output-demo-pharma-mx/bom-spec.yaml @@ -0,0 +1,71 @@ +# Prompt 13: BOM generator +# ExaCS X11M Half Rack + ADB-S + networking + security + +metadata: + customer: "PharmaCorp Mexico" + prepared_by: "Carlos Mendoza — Solutions Architect" + date: "2026-04-12" + currency: "USD" + contract_months: 12 + discount_pct: 0.45 + notes: "ExaCS BYOL — customer has existing Oracle DB EE licenses" + +line_items: + # ExaCS Production — Queretaro + - category: "Exadata Cloud Service" + product: "ExaCS X11M Half Rack — DB Server" + sku: "B92459" + qty: 4 + unit: "OCPU per hour" + hours_units: 744 + months: 12 + notes: "4 DB servers, 128 ECPUs each, BYOL" + + - category: "Exadata Cloud Service" + product: "ExaCS X11M Half Rack — Storage Server" + sku: "B92460" + qty: 6 + unit: "per hour" + hours_units: 744 + months: 12 + notes: "6 storage servers" + + # ADB-S + - category: "Autonomous Database" + product: "ADB-S Serverless ECPU" + sku: "B97472" + qty: 32 + unit: "ECPU per hour" + hours_units: 744 + months: 12 + notes: "32 ECPU for DW migration (Phase 2)" + + # Storage + - category: "Block Storage" + product: "Block Volume Performance Units" + sku: "B91628" + qty: 50000 + unit: "GB per month" + hours_units: 1 + months: 12 + notes: "50TB block storage" + + # Networking + - category: "Networking" + product: "FastConnect 10Gbps" + sku: "B91960" + qty: 2 + unit: "port per hour" + hours_units: 744 + months: 12 + notes: "Dual 10Gbps circuits" + + # Security + - category: "Security" + product: "OCI Vault — Key Management" + sku: "B92098" + qty: 10 + unit: "key version per month" + hours_units: 1 + months: 12 + notes: "TDE keys for 3 databases + DR + backups" diff --git a/examples/output-demo-pharma-mx/demo-presentation.pptx b/examples/output-demo-pharma-mx/demo-presentation.pptx new file mode 100644 index 0000000..ac4cce0 Binary files /dev/null and b/examples/output-demo-pharma-mx/demo-presentation.pptx differ diff --git a/examples/output-demo-pharma-mx/diagram-spec.yaml b/examples/output-demo-pharma-mx/diagram-spec.yaml new file mode 100644 index 0000000..0e854e3 --- /dev/null +++ b/examples/output-demo-pharma-mx/diagram-spec.yaml @@ -0,0 +1,54 @@ +# Prompt 2: Architecture diagram +# ExaCS dual-region with Data Guard, Hub-Spoke, dual FastConnect + +title: "PharmaCorp Mexico — ExaCS Migration Architecture" + +regions: + - name: "Queretaro (Primary)" + availability_domains: + - name: "AD-1" + subnets: + - name: "DB Subnet (Private)" + services: + - name: "ExaCS X11M" + type: "database" + notes: "3 DBs: EBS R12, SAP, DW" + - name: "App Subnet (Private)" + services: + - name: "EBS App Tier" + type: "compute" + - name: "Bastion" + type: "security" + - name: "Public Subnet" + services: + - name: "WAF" + type: "security" + notes: "Protects EBS web tier" + hub_services: + - name: "DRG" + type: "networking" + - name: "OCI Vault" + type: "security" + - name: "OCI Audit + Logging" + type: "observability" + + - name: "Sao Paulo (DR)" + availability_domains: + - name: "AD-1" + subnets: + - name: "DB Subnet (Private)" + services: + - name: "ExaCS Standby" + type: "database" + notes: "Data Guard: EBS + SAP" + +connections: + - from: "Mexico City DC" + to: "DRG (Queretaro)" + type: "FastConnect 10Gbps Dual" + - from: "ExaCS X11M" + to: "ExaCS Standby" + type: "Data Guard (async redo)" + - from: "DRG" + to: "Sao Paulo VCN" + type: "Remote peering" diff --git a/examples/output-demo-pharma-mx/opt01-architecture-proposal.pptx b/examples/output-demo-pharma-mx/opt01-architecture-proposal.pptx new file mode 100644 index 0000000..39c932c Binary files /dev/null and b/examples/output-demo-pharma-mx/opt01-architecture-proposal.pptx differ diff --git a/examples/output-demo-pharma-mx/opt01-customer-proposal.pdf b/examples/output-demo-pharma-mx/opt01-customer-proposal.pdf new file mode 100644 index 0000000..9f57bcf --- /dev/null +++ b/examples/output-demo-pharma-mx/opt01-customer-proposal.pdf @@ -0,0 +1,269 @@ +%PDF-1.4 +%“Œ‹ž ReportLab Generated PDF document (opensource) +1 0 obj +<< +/F1 2 0 R /F2 3 0 R /F3 4 0 R /F4 8 0 R /F5 10 0 R /F6 14 0 R +>> +endobj +2 0 obj +<< +/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font +>> +endobj +3 0 obj +<< +/BaseFont /Helvetica-Oblique /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font +>> +endobj +4 0 obj +<< +/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font +>> +endobj +5 0 obj +<< +/Contents 21 0 R /MediaBox [ 0 0 612 792 ] /Parent 20 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +6 0 obj +<< +/Contents 22 0 R /MediaBox [ 0 0 612 792 ] /Parent 20 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +7 0 obj +<< +/Contents 23 0 R /MediaBox [ 0 0 612 792 ] /Parent 20 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +8 0 obj +<< +/BaseFont /ZapfDingbats /Name /F4 /Subtype /Type1 /Type /Font +>> +endobj +9 0 obj +<< +/Contents 24 0 R /MediaBox [ 0 0 612 792 ] /Parent 20 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +10 0 obj +<< +/BaseFont /Helvetica-BoldOblique /Encoding /WinAnsiEncoding /Name /F5 /Subtype /Type1 /Type /Font +>> +endobj +11 0 obj +<< +/Contents 25 0 R /MediaBox [ 0 0 612 792 ] /Parent 20 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +12 0 obj +<< +/Contents 26 0 R /MediaBox [ 0 0 612 792 ] /Parent 20 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +13 0 obj +<< +/Contents 27 0 R /MediaBox [ 0 0 612 792 ] /Parent 20 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +14 0 obj +<< +/BaseFont /Symbol /Name /F6 /Subtype /Type1 /Type /Font +>> +endobj +15 0 obj +<< +/Contents 28 0 R /MediaBox [ 0 0 612 792 ] /Parent 20 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +16 0 obj +<< +/Contents 29 0 R /MediaBox [ 0 0 612 792 ] /Parent 20 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +17 0 obj +<< +/Contents 30 0 R /MediaBox [ 0 0 612 792 ] /Parent 20 0 R /Resources << +/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> /Rotate 0 /Trans << + +>> + /Type /Page +>> +endobj +18 0 obj +<< +/PageMode /UseNone /Pages 20 0 R /Type /Catalog +>> +endobj +19 0 obj +<< +/Author (Carlos Mendoza) /CreationDate (D:20260412231513-03'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260412231513-03'00') /Producer (ReportLab PDF Library - \(opensource\)) + /Subject (OCI Architecture Proposal) /Title (PharmaCorp Mexico \204 Oracle Database Migration to OCI) /Trapped /False +>> +endobj +20 0 obj +<< +/Count 10 /Kids [ 5 0 R 6 0 R 7 0 R 9 0 R 11 0 R 12 0 R 13 0 R 15 0 R 16 0 R 17 0 R ] /Type /Pages +>> +endobj +21 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 570 +>> +stream +Gatn!9lJN8&;KZL(%6/,_8K]#EeJ:l.T*U0*&qmlM74Fg`5,#;(\-N'-VMuB'qu>HjKV4HH(UKZ7nS[mHdr.89>#_o_$.t%\7,g,HX)fW[tO9ku"nE2^<'Ec(4/Jd!5orY,R7fk6%0Epd+.jNU&$5)@Pr2@L9;]=tW2!h!?W/D1*7?jmJV\5>aVpd,qeAbBT/G3LD.'U,>9Q106VHIC2Ur;+\Y)FmB7)D4Pp,f?OA/&i;!0?(V#BM]D_L1l*Cp*jK+1RT<`r3PX7Tm-oq;lLg(g%5LRLHgAeDPM.8o^Xe0B6p:F_Q.EqFpJia!%ndARjp0@~>endstream +endobj +22 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 2000 +>> +stream +Gau0D>Beg[%"?O+^r(JYe(L`lh08RUHe5ST(OJdsnj6!V_aY7R8kSAu5EN0]-]RL?dn\XgV$Pu]n.>Xf^rAUWr/.$,Z\$PI+po(p>`[f1s,Y%ifcGjF]c9-N!mcW14>/O0.?+"el9_U)ZM^OSbB5oc\R;t$"MP*VC*HsaC9@`]&s?+*KJFBLhD(;#,H2#0kMJ]ZpL3V%-6KY,FW'1AJ\NOU,kIEpG[:]BY)-8C*JHBqLhm_"kY5_sZo=<&]&RHMNBcRu^H+b-a)\*d1pk->.5p?S2g@ZG'npFm%gjU\TJlJp"KjF5Xb:U[?u&GUVUIsP#SmJ^"8%]5_tIG&ZGD4Ye#@tg[85;^1cYFnQHjprVUn/N6d+uc4PAXl'c!OlgaFYpCnIchO:b5@%,ckHRe5i?_mGRj3_X&?AhE6ULC56akH*Ma@]0FfjY(_[+;q*_>pkn"8+r)Yi0q,)/kLq%@M<\uHX\j^\,qSVT@V)C_)\&QMQ&38`NN[6,jO_RtT<(f6##7.roECBt&PPB#S-/+a!,sec0o^Q@hq7=SnNnTp9aUf@sl]3ulmlO[=r-!Q?<9j/`Q.jl.A0*BKL#uAqKS$OW88Nb6TdaO=uN'aZ'&[T>YJ4A@N-45ZMR&]Qdf[7QI5b*$jrl?'G\Xid?_*`;(W]^0uf?VXk3]Q:Mf2FY;&`Ze9@kK93IW92@!;eKCqs_,itK[Js;c=1i!7@K:Kr^rBudX!n3bR)&pJ$B+LtTm)QcKM,@D&nY$m3=7"MkIT%\?Xl0uVk^PZpT#p/oBJoIH_'Oo_/RlV&0m5e3Q2nrUKGh%$6c!8MpeQRD(&2agb4D$F)YmFT(l9/dT".ZHQ/E6p(,$=bkK6L8S@L`04<=uXHtM,@pjF*1Q6Ra@]Jk'%5h'ETC;%\eG!>;(=]+_:+7Oc9`b_,lt/`?PXskhaKPp4r&97;Q,LLB?b^VN=0h;1#>r#(i^O9AfpRBinHbtmk:7Sq@5]KfQ+V$E]_[FEZ#"N\]?a)]=V>b9^pjBcaq%uSS;$;VI4@q-U*eHg#si(!t4k;6a\8i7^\IY.sRE7^P`HFgd]6mSdG-SHJ;Ts25Mp3c/&W4SZ>gaD'RD>PAJ@endstream +endobj +23 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 2270 +>> +stream +Gau0D8U&oI&AJ$CbY`()QJa*iY8>/^dO)5/WD*o65U7VKi>)F#U]1,8J;YhrQK)"kGn+O"1RRuMqd9U\raY[%,R8S)J=eJ30FnpL@"B!,iXMD2:-P:0PM#Q+*]W"%#T5hi2\0dY:HZ-K.3K%,&k7sM(rl8$KDA*>/gbF6-Yeo,JKK3e!1\SE8JHc/RTMNM[3bq*RUd.:Tc?PR)m441>,hqdMD$_6?bkZ>=StGLL,(<%-IG*HZn,65'nqc4)i-IPG8e),_:3&F#ec)^$[LccSNB"aC&G6>s48E4l8u]rJ/::eitPi.n/q2=A'QnPCn=X!B&L4+1_=nmJa"F((FCcfPiNN2esPBg6,<[eAGC,=HR?:2@J]f:8'U+YB3cG#<3hWU,c4TDY*CON=_0qgSUBnmB\K(Q$,PQ/""@/N\K(4ba!Uob[D$>4bJXd@.Dcus>uVUsHLABXFKVj`AoDKk3>5T!Mh@<#rCI*>-uKbT>6;5]/4,C"$_rc!1')`d28ei(SW-nZ=-ZV;aKjafXN[_=-IQ_bXe"_hI.Y&Xi[n1t6-]k^Ntert[k\O6m\JM9Y>(F+KBj72(o1Vhco'_XcE;ljC'L_:_96$*6>-g1E^gi;U[Bu?Yqd_2WNn!RMi9)nfr79!G[_.DLW07@SVtkIPpj!>=l=(,2@mFl[a#9r#f\?n'm^?-h[630Jtb)P%^#7?Aq8*Z&aGHR@2p=;l`7,Bk1KG=Sec`U"Ks9G?Pb63[8D(q9K4=h.NZTLQ=YmEhYpKU0HX1"^d9Hg0l?K6/n*X"ILEg"V'6Ut#>\suW!sEi*XQJ25J$r5G`aWKP68#Rj]GUG-NSoTGGY.h$#[@R#7p7;UrpEjdAsN#eoVN/n^#[.g(qE\aTb9k.sVIk$KV7j#o=G)C`io@N]p]#/)7>N]H-if9"!1umS?b*Xc&D[#*MGThVp^(50PWm1BgXnq9(eRM.M%de`glE':gprS(4`&3sSV.C0OOkJkojV6%$Lh`Q".9ZJWX05;4PXW[uLErd.D'AN_Z5-.A2juhCqTBdL>Mk\22;.OFbj&/2Tfk@kabrP,W\6U7*ouHW,Z8-f%rrUR3$PgtB#tm:]$$9Yc\ir7SiT=Gd+HkZaBTs6&efIFUkYY%^@F2??WTXlaB/Jr]mp='XK?t&_Ps_(!Os0Np!iIYaOi+s/>Al:E[NkB4ekBIE8k"OHoTG98-+/C-Kq]XiS)Z-4;E/`,F:b+K76H:&0hR=$+oX?l-Q)Q/W**RpMYg0Yf3,5l4t93#.ji1l1%0RIMRU@sbV6@*eiQ92XW'2nNsFHW&H*91=%MUeWc@WC&Y2,l"&&67BWcOE9sI,#27s@h1YlkZ:Ys"(HuH8aQ%QkOF/EqE.A"b\.WG@ACtk=$jPrG^83--/ZT5j[kf-1rHM\-EijSoO\,##():bj4#Wj3WA,_Z(3Lf.Y%3BW1]Ttr'jUi^GIPEd=^e=paLV"I`PigB#V!Dhgp;HN.%6@X(r:T7g@!Ta4*@NO>3]UkGTsBF#j#dg(B,&\Q5PA"/??D9K)-(8ea$%k)TA\Q'&nh4"7Uho]?"Vk#Y,J+Uo'&O3nt4V$*fek3Y3]99OSC)!-$V@cW)%?`!u0s]0HJ3DH#k8O)C@3=+YAnhjiZD]Z,@WW&OIdp/Zn-VSK#6ID3U^R_TC@U-oFQ\qY3(iSk'17`SaPuN`%Up/UP3-$u[HLZ,b^P_6e$V`s8-"ipln]'9Anj\lUbAk(U7>=NmMQ[-ZTY"s,c8\C4O(`TuhM?GtX(#B/t-p#4I!m.LpkP"c-h(%sendstream +endobj +24 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 1936 +>> +stream +Gau0D?!#c?&:N_CbgW/j?!L$g^Wu7?8q>@-7nU((+*^X&-#p2l<48Luq]/7J#`q"tlTI8H[URM:RCOPJ6,:GM1#GP4n6lao:C%L=iu&Ej0GpG"nbD%_JJ1MU(K59daF&RUrC#W@oROgW5lj0%cjq6(hiGue#,?g9\O]q_SR?$Q@@g8)"qDk'%"*$@'(J=cF$5)U+;ofD;@^D!JubC`8[X3ZnMed'h+DYCh&>9]5cmUK%MAhJC-dI7RuM69fS_&@cK2Ps"to;H]CT6d)_&[:jamGm>-E.-]U)kmOqS/!Hi+\1#Xo(VO8%+&@rcYP2kb\.2PZ1W'U=[`'Yaf^-aGB#9gDbF$T6S"pc,n+4L#eqKG'Hpa",4l2gm76!Eib&dkd1,4C22G_4rnOs"'UdI\RNWJ*TkR?o/a4M9r9^U+f=XcX3Z*5ZN*8DLnP%98j-nE7e;8N_TUf.:MM.mi7R>ge;[MQ5gi:t1qGVO%jeJn1:0LbjP?K-&QQ@pkk,r3mB.A.@J),-b&bHUI;"k+ptJN#rfOpRV@OWMI/<,L(GrDBAc?*Q=r5k2fG5;b-4lW2TLsI^)o6N`jAU8`COJS]3$b!.tqfjQ,411fK+f/+sgXj(7Qal_al_M+%1[8=#4^d3cgq,N^^gGD%4b0fISn%^!Njc6Fan=3TIC:T!%uI"5*)<;ARpR4&\C8i'bt.Cl_#j-tF[f]:&,u&MBKTYhbCRRo+oG9j_IRptVf`-8`7\/\1W3L'tUsBe+]]-@YKt'E3F["^Pm:hqW%IGb_ZEURq+>qddWnI)Z*[@U@^>$6R;jo,`7c7[l-dN"P&a)Aq.>DqASaQTE]e]j(Me3WeoOJ$=-t+$RFR.6d?1MA/5ADO5ph/T=3(WKl#A=u'V;09Y-j6dI;1SI/O9"T.<3P8IH/`=l\tjkFJ%PNSNMJp@8u%n9XXChp6J4#)F8YED=Xbl>VdBj(NeS%3eq`KI"39k=?G#1FL0B$9=faF(G(>)]aga2e\aaFHK2#Ipf,^qne8?bb$_,\jtLVZqL*khV=SKWCk(39sr(K>C5TKeb)M=%K\0mpDReF^2Uh-$V&-q@2X!DVhb:oV/Q_Qm5fa!ITco4Q=HP\]PLp#tnOI7<+YD=laFO=JH5Z/l>oEoMOrSW)JC!dmkXSALiFS.4hf/$0CthQZt\B_/BkI))"Vo\PR?E,S0%UKEFjn'/?Uh42jAJF[G1_;;FlfgZlrK2#*.)jKMn3>6/)k/hN\#f;EdDcqlL>Ok6GR9Ng)"d4"2kf[p+Z+iikM!;Br3NjYu#K"+GZQ_RJUFXCq2fIWH/@%0A#C=Z/!$kNB?bsQp5-)NuQ1H=?)FX2l3lQ?;.OKbf6)4jaSU(XI;'o8JT=X%cgYu03]D2khB.TmpfI4TA"9uhKtN2p'T*gUD&iYAUIAS$.g([3Ta4LcB'S..tJd64:Em^977,kAQ8Gl3@-(V!*-U.dG=nMpYkkW=#""ZPV./&d]G^ni[?HIendstream +endobj +25 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 2236 +>> +stream +Gau`U=``=W%"?O+^dC2I[Y[=KeDYgsS2Atqe"j7Xh9P)8O_I=f%Tc/`m]TuZP'k3VI"\gfRFX2CiqabtKIIK1U\b!5"umX=aa4AZ_-dD1>9!j>i-]M5lbN(=@WrYkbi92P&+tpuc,B^9a+FL7%\D]I%$'B6<;<,DdE@jp`&b><1ChXdRDF6A;q)(/k&QmPC+6BK)Kp[un#&M.r.`c]a,<99U25#cI*nA1tB(#ksn2A\OHh6f.fK]WZY5J$ne=I>dL3pHtNAU'T6/)/l712;lmuE#k5Ctn?=[VDPZc0k$MGAOQg(o7b8[jG.lJjjg&Gk4?";kL]f'kUUGd,27ZF,C$i=&Md(DfRNZaZ%OeL_FUbT$02/2(qrqirh"k1":f'1J`Z>>_K'krdsArfo\9BY)bk0@YQU%'"[2)Nn2I%h`[jD$P`8o8=n_Wp6)MrAlpg8^LG/Y=I3oN&BlB/Saqo5ZYpK2=EHUGRU#R0:[;,(`/D"Y/B/1A-U;=?`5`:b'PsG"=e#;)uSH=0!:)H'-*%X/no,1f;7ro:^PF49FIb.o,M%jLpuBf\Snit@uP9V\hWL-0GXZ(?GH^lZNhJV`[SL5XmkE`'%2'boM)G^bnMs\L\1/3Z'kVq9,oSaC88%Yi!SEA;2DO`_)\3l7tOLWM"$B2!l<)oF%nlM\N<_)(FpuDDi`cfmegj).D8CDa[Y#m%Wa62PWrhN4%1aGL'$Fqj9"o*3[*a`,?bB`&\L19:OqBqh\1LmK/kDVSn/Ffb**C@l(FS/P`TKk:dmO$QhQO?1&g*0OCleH8DK0T7"a*1WHn6YZarl//KK&s(Vmc^)W86t'M:_DNe$g?uO6O'H]<%016e!L^V2Ir--rQA]]gAOK_\@LsTY)U`cS]We>QPT$/R?`3d^.318dd^FFl/)Mbbon:YG"o-oIPW#!B"p"F$Cce+Pl9mQI=Bn*7sP>.Lb7+<&EPSs+KF5f9Z-8$>p^7*>Re:1>E&D10ED?$NlYfhN/1s:2Po2^.+OqU/fnO5gjf9s=f<5se:U?XDOcI,Ss^[UcC\)6/#lcIWG$NN`RU2fZ\F@<.?u`;eZ,=GRb@*nH_h4k!7M#h]p`*>3)p!Qa/IO/[V+?r);3TaAoGYIQ-n-7/4O5]TWNYa`?S@k37Z?UC*':ak<(D-h9Y24[#M>hn*_]d/]cD)594u88]K,@:SF@B_Gqq7W#D_:?c_1'*25-KM&Q=UL;c<3C@7OWP=_4NP[:)eZ0&EqY*"o!%$[&M[3;=P"D*muM5=s@+uDSMdIOo@;TgBKe=)k'MZRfT;$=H@^X\[TksW++RekF,/D@6j8jDa4e*h@8=+fHcP)gfN23Q+5@F@ho%olmIP=\bUPY3MQe`;%/U@u=K^I$?DX+U7W-p_ErH]a<8HYRrb.,:g6Fdpts%fQWdQ&``~>endstream +endobj +26 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 2147 +>> +stream +Gau0E>BA7Q'RoMS3"KRJ5iPDAI-Y"*QJJj2Q8Uf59OEIJ[YD^1ZI@6O^IQ#W\N*4n_gp!gFDfuucG^J'rh9/&i<8(L#Y4>3:^4g!T\SN\quCBIK:`C7k7]pb?nm^('Hd1$%'KUo@.87LK>YNH>aU'%q"`Y]D@T9^^?-25DTU,^[_i.V(8oZ'*O(V=FZ`LpH35a!ar0?2-IB;L&8EBnM42;8r"Xq-CD_MUi>^%E\VE53k;N#CP5$XJaZ,3s\?X![8Dk02+5+LXh\j+mS?h>#"D^9_^>Sag>NZ`I2d;9-Q4U@W*l;cgd;Gu5)?hH&cnJ9mRQ_^A?Ci#\P;:s1kS(LR0j\*8ULr5EUQNA$2jB4Y2u4;klX&FE&fn][-:g`pI\sn&hiIXXJ&^2W5FA,qj,$To6h:27N7uRrJURb,OTl!M`p4l!1hFf]/DkEIFWYhMtQ;"?.PbOq^go@H$QIaHS/sSbOJ!\T)sA!Fc[\`,k?6WThC+QG=^Wm<#D3r?IYklMS:%mFYYfq1i4amCW>oP[M(?]W<;=fuI(6rS!AAOsi7U,On!$@!2%-`.7`]EOYLh0c;"?"S-aQ[.>>$6$BQ6ST4s=2u#gB/i.VT3^&kt/kRHJcS+\0kY*F'i;:6ZGWHLaqQ+>V;E4A2Brc'K\n/EO#i06l%l2CjOX,*$:;n''I,R]$YoJdW10R>aQSb&->t1N$eb[V]n7@5T7t4:]Ef\hVAQF[\rlOW\D(*p-1hBj2_2hESJm/*U$P^NJKc/?!9M."^Nq4CsUYN=t?UB,kZPsmED"dc0g!?lX.PKE4PA+RR,-kGo7>]ZkS1Sqk\Y?])>g0=L',FT&;>T2ru^gi83+a>0=7I0W+,g3HLXgk#HHWY,n-Cd+WJ+4TM=L[@4c@J`c9r;Dr9Ch\X2a'=>*c9BfS$EbF/sg=n8hrNCU'I[EQb;&7:8(3fKjLMrnIbFJn1(u?RFGgnpEe?05To(aa4YY',U25_QYL9m'_fKMFJ3dM`e>c#&?)ekEA-1,3Pl!M823;pM1\6!HNN)3P4?D[+]g=m>(a"Y;,oFX0b\+R[;8NPopUTAf%2>JrjW?<-01K)&R^$^q2:"HRm#0?Q*5283$LLd8i17nQ`;\Y:UVo%"5(1RWno7F(qi,pK_[H/H2f3e5Te0tpPPT4gENQPPMFGemsPYZ$J[322rUj!tkESoJcC45HaBJ&3J]9OT.asW\0dc*2Lg$nsT6'Oreo4X%Br_*"rAndQ)AGbla"anMbI0uCmA"MC,-Lrb#C]i_0X]O%5l\c<3Kn453bm5Sq+'g.eJPL5!P?qlDO("QjnbVs1s:NJ~>endstream +endobj +27 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 2272 +>> +stream +Gb!#^h,E&f&:`lHfV_Ku.?5^(:ZieI'PM@kUkEO\^l*/";"7V(#KkE/jI2"jhZu[c#ImDUS(K)Zj=Cf:D>EV%OaFZ6suG@=>kh?=`2Uo?uiJJk=TT_AhTB_VI2\Y`ZZ.j?d?(EVXD0bM<)TlsBYJRSe2&q6RQt0'/JlB<*1W=[:ni5QU[oU"70$;bG%8=#"K(-2bHoPB5Ep+!LK^R1VO3s8W0nr:BMg%%RlXZ]r^3\Qb2MIlHGnAT=*hfj?/*0h@U.GjhlXZ,>Bd[8*?u,F9)&">%If6oUie@lCUR)RQ4%R?+a$a'dW]IFH36AJpEG)lEFdO`'Hu@(nSk)]EQHU0`0OrJ@`H>?$o"obA5WO)2qDZB.s5eQ68h$*>Jl)#A?]r)?>RlM0q^eQGrM;2['f7B>!S3:9+>[$nGg[2+0>FXs/tPhD>G?HVQp2`0)tX]STX7%6*b(+l>Sf)ll58_5ICiH;]keJ7XU76=[R"op65I\N/P#(KU'/Zu?6qZdJYCO)e8nL+#@eOl6nkVtbOjT1@:'S;)FFSpY4HD/?YO/8a9"GjVMu6r0NHe1Q^sfc=6\'3X0hWtmR?4ej9J16pJV!#/eH+qa^K]`$,F;ed>V^\LEt19_beS*9e0rbl0!\-JXhlQk2Y[dj.;jF:f_&G.([Gd4&-lK"i7drPE[`6p^V>9jWG`aUNiS..=(LCPUASVA]U(@"'nA*$TA:-^n&PuC.$\nG(%EEGb_lHO$8O%3di1@C4&+bd:^hk@>XS-__R7f"6XknhSElaU^Xtrc[[TG9gj6)Lp2dI\k:0eN5=[k/oH>L`$=4/d8)Zje>D0lQu,Cg(BX'(82D!j.l$)mJp$Yjd[OlhNb;djQ4mM#*pON,%b(,+nf`si*163dUo[g4#fq8#lCGl0'QV%=%aqdA>AQmoo5DF%LD/.II%'gee9VWLR`5l\\+0Ji2QJQciV&0_FT4n"`_,MQUfce]m+&57T"P\]p6'Wg(%3tpR8Kq?.ZM@j>0/PCf$XUlLd\'^TOkJ+D?JXhe\0/;*0i!^CgVH!*"GmH('4(SS"08`*W*?.G0r6`&uG5[&@*U1HZGh/9ul&F\j*a]&p^6d3G0P_]?W#[pD&9tS)S%ULDi`Yj7^%!pZi&Tr!I-)jKY=QYaIg/IjcOm7mV)Sc]R.WP(:s&+KH,@biQN_>MK+qBDWD@aBNZf%oLGT#2eE/E+22X#56AA@4e9:*V=_'b+@j8.#?(*o\lF^/\oSSTPic5)-0$8uKr2r[:X_/[YR"EF!+hS?tB)HGZl~>endstream +endobj +28 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 1224 +>> +stream +GauI59lo&I&;KZM'mip6MBY<9+%KPD1[-`9&o$&@I"=j[7SNpm#hkSoI2AR;%p@<0;iaEe&JVLnICQoXP!FsJ&q8".i-5:O1BN6H@L7]V$l4?.l!j9p'P2Q['GMa[0i%5rcR=2@321@Rd_H`24GEI'>'[[93"RNPc14A6q(AA0h,!XUe$Up%gu/HnL[MqSI@Vhq1!s/O[KLe5k?BGTYsGhrY#o:U*>)mq5C^$"rbt_M8;,Ebgmtt+[`"=oB=XlL(GO;Lh0+Jn.;KZ+d!b3pE">r%lsAXe$J]"q=oR4iP)oca2%J7'i85Yo"'HSFIfMkK$k&gB8p5KYiV-jZ?3dFYV[,s>kPLD\F%l"le70[)::'8bheuVW2dZ,qU1bs&FtZs!^?=pYJ94Tq+$2sj-U-?9'Yd`VV)nqFd5;6YjY\S27-$]&cr6c[:kc8>NL.^4O=0eg"T*)rt6ou\RL1B85?aQpm2cs%n^3h._C1W+F!F5?K$Mu.1C3Fba/2#O?YpV8u&:X+GY\\eYP2pJAkY%_TLnZpP]-hSr$XKpo=#dl,ZT0EChg0"5'@puuKZ.!/q5Z#e06R?c9+D$OA3XI,]FA9>&o`l94#dnE6h/XXWG]l;jYY84W:UFHJ:0@GQ/F&FiujC:W`Q]L8+D>;aV^=2+&P^V^gU[Em]<;He6gt4Ii?"&?H"I!(RN[g*3EdY59n8O)eCqjSdPe7GJhig'C(-aAt$//=Ms^;WT3k%T-aA-QBD)B,r<^6m3bM.&Yj*G6*>B"P&3XNO>%#d&BTA!1uCnd4H+mL[M*+NS%aJMH>0XYD'*)_G.:rP0:F0Dr;~>endstream +endobj +29 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 446 +>> +stream +GatU.b>,r/&A70Vjp2r3gTb8c#SBKr+C=jE.o"b`*lW!76[V">P"KF=:<8<:]unREGg/MP@f;nM^f?-BS:PZj9/&X7Z9)<(dRAN"#UbYqRu$)LC*3\E9Me)Kh.II/U6/1U2FEXiN/1SV,@FBQE>#qL9J$IBR*9HV8%i8VF%>Wmb^e!0:-Dbl%9=?E@K+g$ot9U$KM-al!?en?.Eikgm^b0D=N5`BCi,g>.*/f\'<@SmETkMY&hRE:di&>=/?6~>endstream +endobj +30 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] /Length 765 +>> +stream +GatU/gQ'`:&:O"KbSp^chDk6l_M[G!&.=sLE8sN*8F0_G$iPFl::mmF!XYPm[d24!F3aF$eF>B2h9q@At-K.ZjDX)HPDHLnaP6I,g:H\W[TsWd;esb-I-*]hqaWHJ;S2GHg]DCW"eGs@G"\_OVJa7nWJAcf<=(6g$-L*8^^,Nc`4!1jg2.+mgY)H'/'3P@Upb6_,bq*Nc\qKZR\Y;X#2M#>0?m&g_c)B(gl*8@sQrC:%HC@O(']K2dNpb%M"Jqus=&<0X8&']F8'Aiglc%ZDG=RoZW!8;\M+sB"9C1A\e)7U(\I=TUVDaihb9gZ+XgMp1VKH=)b*7R.*=ALNrdYr+C7cFW2IH];/3pIH4nqR[-p24g26(Scmih>6#7%0AfWc'$n;W$kq$V-&EEl?lQK\.R,j'\`,@hZX+*-LmgUtSJ21p^I10RXYgU[YT!JQTEY7?js]C3pBZ'0.0(R6,!J@U>j"dm#2K=r`7E%KtlYJt*_JTs%E`L%,2Bm6V!.a,%X>4doGSr;r[E>`o~>endstream +endobj +xref +0 31 +0000000000 65535 f +0000000061 00000 n +0000000144 00000 n +0000000251 00000 n +0000000366 00000 n +0000000478 00000 n +0000000673 00000 n +0000000868 00000 n +0000001063 00000 n +0000001146 00000 n +0000001341 00000 n +0000001461 00000 n +0000001657 00000 n +0000001853 00000 n +0000002049 00000 n +0000002127 00000 n +0000002323 00000 n +0000002519 00000 n +0000002715 00000 n +0000002785 00000 n +0000003119 00000 n +0000003240 00000 n +0000003901 00000 n +0000005993 00000 n +0000008355 00000 n +0000010383 00000 n +0000012711 00000 n +0000014950 00000 n +0000017314 00000 n +0000018630 00000 n +0000019167 00000 n +trailer +<< +/ID +[<058687b5e54d5950ae70b0c7d0f56515><058687b5e54d5950ae70b0c7d0f56515>] +% ReportLab generated PDF document -- digest (opensource) + +/Info 19 0 R +/Root 18 0 R +/Size 31 +>> +startxref +20023 +%%EOF diff --git a/examples/output-demo-pharma-mx/opt02-architecture.drawio b/examples/output-demo-pharma-mx/opt02-architecture.drawio new file mode 100644 index 0000000..125d88a --- /dev/null +++ b/examples/output-demo-pharma-mx/opt02-architecture.drawio @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/output-demo-pharma-mx/opt04-cost-estimate.json b/examples/output-demo-pharma-mx/opt04-cost-estimate.json new file mode 100644 index 0000000..9d7041f --- /dev/null +++ b/examples/output-demo-pharma-mx/opt04-cost-estimate.json @@ -0,0 +1,111 @@ +{ + "cost": { + "line_items": [ + { + "component": "ExaCS X11M Quarter Rack \u2014 Queretaro (Prod)", + "monthly_payg": "$18,500", + "monthly_byol": "$8,200", + "notes": "2 DB servers, 3 storage servers, BYOL" + }, + { + "component": "ExaCS X11M Quarter Rack \u2014 Sao Paulo (DR)", + "monthly_payg": "$18,500", + "monthly_byol": "$8,200", + "notes": "ADG standby, BYOL" + }, + { + "component": "ADB-S 16 ECPU (DW alternative \u2014 future)", + "monthly_payg": "$2,400", + "monthly_byol": "$1,200", + "notes": "Optional \u2014 migrate DW to ADB-S in Phase 2" + }, + { + "component": "FastConnect 10Gbps Dual", + "monthly_payg": "$3,060", + "notes": "2 x $1,530/month" + }, + { + "component": "OCI Vault", + "monthly_payg": "$500", + "notes": "HSM-backed key management" + }, + { + "component": "Object Storage (50TB backup)", + "monthly_payg": "$1,200", + "notes": "RMAN backups + DW backup" + }, + { + "component": "WAF + Logging + Monitoring", + "monthly_payg": "$800", + "notes": "WAF for EBS web tier + audit logging" + }, + { + "component": "TOTAL", + "monthly_payg": "$45,000", + "monthly_byol": "$23,200", + "notes": "BYOL saves 48%" + } + ], + "assumptions": [ + "BYOL assumes existing Oracle Database EE licenses with active support", + "ExaCS pricing based on current OCI list prices", + "DR standby at full rate (ADG requires active compute)", + "No middleware licensing included (EBS app tier on compute VMs)", + "FastConnect partner charges not included" + ], + "show_byol": true + }, + "cost_comparison": { + "title": "Cost Comparison: On-Prem HW Refresh vs OCI Migration", + "col_headers": [ + "Component", + "On-Prem Refresh (5yr)", + "OCI ExaCS BYOL", + "Delta" + ], + "rows": [ + { + "item": "Infrastructure (hardware/cloud)", + "current": "$1,800,000 upfront", + "oci": "$278,400/yr", + "savings": "Break-even at 3.2 years" + }, + { + "item": "Annual Support & Maintenance", + "current": "$220,000/yr", + "oci": "Included in OCI", + "savings": "-100%" + }, + { + "item": "DR Infrastructure", + "current": "$0 (no DR today)", + "oci": "$98,400/yr", + "savings": "New capability \u2014 no DR today" + }, + { + "item": "Data Center (power/cooling/space)", + "current": "$80,000/yr", + "oci": "$0", + "savings": "-100%" + }, + { + "item": "DBA Operations (patching)", + "current": "$60,000/yr (part-time DBA)", + "oci": "$0 (automated)", + "savings": "-100%" + }, + { + "item": "TOTAL ANNUAL (year 1)", + "current": "$2,160,000", + "oci": "$376,800", + "savings": "-83%" + }, + { + "item": "TOTAL 3-YEAR TCO", + "current": "$2,880,000", + "oci": "$1,130,400", + "savings": "-$1.75M (61%)" + } + ] + } +} diff --git a/examples/output-demo-pharma-mx/opt05-wa-scorecard.yaml b/examples/output-demo-pharma-mx/opt05-wa-scorecard.yaml new file mode 100644 index 0000000..6dcb8e0 --- /dev/null +++ b/examples/output-demo-pharma-mx/opt05-wa-scorecard.yaml @@ -0,0 +1,348 @@ +well_architected_scorecard: + overall_status: GAPS_IDENTIFIED + generated_date: '2026-04-12T23:15:18.437115' + architecture_name: /tmp/demo-flawed-arch.yaml + customer: Demo Flawed Arch + summary: + total_checks: 23 + total_passed: 1 + total_gaps: 22 + high_severity_gaps: 10 + medium_severity_gaps: 10 + low_severity_gaps: 2 + pillars: + security_compliance: + status: GAPS_IDENTIFIED + checks_passed: 0 + checks_total: 15 + categories: + identity_access: + passed: 0 + total: 4 + gaps: + - check_id: SEC-IAM-001 + area: Identity & Access + finding: no IAM policy strategy defined or broad permissions used + severity: HIGH + recommendation: architecture specifies granular IAM policies per compartment/service + wa_reference: https://docs.oracle.com/en/solutions/oci-best-practices/effective-strategies-security-and-compliance1.html + - check_id: SEC-IAM-002 + area: Identity & Access + finding: no MFA mentioned in identity setup + severity: HIGH + recommendation: MFA is specified in identity configuration + wa_reference: https://docs.oracle.com/en/solutions/oci-best-practices/effective-strategies-security-and-compliance1.html + - check_id: SEC-IAM-003 + area: Identity & Access + finding: no mention of admin account restrictions + severity: HIGH + recommendation: separate admin groups defined for operations + wa_reference: https://docs.oracle.com/en/solutions/oci-best-practices/effective-strategies-security-and-compliance1.html + - check_id: SEC-IAM-004 + area: Identity & Access + finding: stored credentials or API keys used for service accounts + severity: HIGH + recommendation: instance principals or resource principals specified for + service-to-service auth + wa_reference: https://docs.oracle.com/en/solutions/oci-best-practices/effective-strategies-security-and-compliance1.html + resource_isolation: + passed: 0 + total: 3 + gaps: + - check_id: SEC-ISO-001 + area: Resource Isolation + finding: flat compartment structure or no compartment strategy + severity: HIGH + recommendation: hierarchical compartment structure defined + wa_reference: https://docs.oracle.com/en/solutions/oci-best-practices/effective-strategies-security-and-compliance1.html + - check_id: SEC-ISO-002 + area: Resource Isolation + finding: no tagging strategy defined + severity: MEDIUM + recommendation: defined tag namespaces with cost, environment, and owner + tags + wa_reference: https://docs.oracle.com/en/solutions/oci-best-practices/effective-strategies-security-and-compliance1.html + - check_id: SEC-ISO-004 + area: Resource Isolation + finding: user credentials used for cross-resource access + severity: HIGH + recommendation: resource principals used for cross-service access + wa_reference: https://docs.oracle.com/en/solutions/oci-best-practices/effective-strategies-security-and-compliance1.html + database_security: + passed: 0 + total: 0 + gaps: [] + data_protection: + passed: 0 + total: 2 + gaps: + - check_id: SEC-DAT-001 + area: Data Protection + finding: any storage service without encryption at rest + severity: HIGH + recommendation: encryption at rest specified for all storage services + wa_reference: https://docs.oracle.com/en/solutions/oci-best-practices/effective-strategies-security-and-compliance1.html + - check_id: SEC-DAT-002 + area: Data Protection + finding: using Oracle-managed keys or no key management strategy + severity: MEDIUM + recommendation: OCI Vault specified for key management + wa_reference: https://docs.oracle.com/en/solutions/oci-best-practices/effective-strategies-security-and-compliance1.html + network_security: + passed: 0 + total: 3 + gaps: + - check_id: SEC-NET-001 + area: Network Security + finding: only Security Lists used without NSGs + severity: MEDIUM + recommendation: NSGs used as primary network security mechanism + wa_reference: https://docs.oracle.com/en/solutions/oci-best-practices/effective-strategies-security-and-compliance1.html + - check_id: SEC-NET-002 + area: Network Security + finding: SSH open to 0.0.0.0/0 + severity: HIGH + recommendation: SSH access restricted to specific CIDR ranges or bastion + wa_reference: https://docs.oracle.com/en/solutions/oci-best-practices/effective-strategies-security-and-compliance1.html + - check_id: SEC-NET-004 + area: Network Security + finding: OCI services accessed via internet gateway + severity: MEDIUM + recommendation: Service Gateway configured in VCN + wa_reference: https://docs.oracle.com/en/solutions/oci-best-practices/effective-strategies-security-and-compliance1.html + monitoring_audit: + passed: 0 + total: 3 + gaps: + - check_id: SEC-MON-001 + area: Monitoring & Audit + finding: Cloud Guard not included in architecture + severity: HIGH + recommendation: Cloud Guard configured with appropriate recipes + wa_reference: https://docs.oracle.com/en/solutions/oci-best-practices/effective-strategies-security-and-compliance1.html + - check_id: SEC-MON-002 + area: Monitoring & Audit + finding: audit service not mentioned or retention not configured + severity: MEDIUM + recommendation: Audit service enabled (enabled by default, verify retention) + wa_reference: https://docs.oracle.com/en/solutions/oci-best-practices/effective-strategies-security-and-compliance1.html + - check_id: SEC-MON-003 + area: Monitoring & Audit + finding: no VCN Flow Logs configured + severity: MEDIUM + recommendation: VCN Flow Logs enabled for critical subnets + wa_reference: https://docs.oracle.com/en/solutions/oci-best-practices/effective-strategies-security-and-compliance1.html + reliability_resilience: + status: PASS_WITH_RECOMMENDATIONS + checks_passed: 0 + checks_total: 1 + categories: + scalability: + passed: 0 + total: 1 + gaps: + - check_id: REL-SCL-002 + area: Scalability + finding: no service limit review planned + severity: LOW + recommendation: service limit review mentioned in deployment plan + wa_reference: https://docs.oracle.com/en/solutions/oci-best-practices/reliable-and-resilient-cloud-topology-practices1.html + fault_tolerant_networking: + passed: 0 + total: 0 + gaps: [] + data_backup: + passed: 0 + total: 0 + gaps: [] + data_replication: + passed: 0 + total: 0 + gaps: [] + disaster_recovery: + passed: 0 + total: 0 + gaps: [] + performance_cost: + status: PASS_WITH_RECOMMENDATIONS + checks_passed: 0 + checks_total: 2 + categories: + compute_sizing: + passed: 0 + total: 0 + gaps: [] + storage_strategy: + passed: 0 + total: 0 + gaps: [] + network_tuning: + passed: 0 + total: 0 + gaps: [] + cost_management: + passed: 0 + total: 2 + gaps: + - check_id: PERF-CST-003 + area: Cost Management + finding: no budget alerts configured + severity: MEDIUM + recommendation: OCI Budgets configured with alert thresholds + wa_reference: https://docs.oracle.com/en/solutions/oci-best-practices/index.html + - check_id: PERF-CST-004 + area: Cost Management + finding: no cost attribution tagging strategy + severity: MEDIUM + recommendation: cost-tracking tags defined and enforced + wa_reference: https://docs.oracle.com/en/solutions/oci-best-practices/index.html + operational_efficiency: + status: GAPS_IDENTIFIED + checks_passed: 1 + checks_total: 5 + categories: + deployment_strategy: + passed: 0 + total: 1 + gaps: + - check_id: OPS-DEP-001 + area: Deployment Strategy + finding: no IaC strategy specified + severity: HIGH + recommendation: Terraform or Resource Manager specified for infrastructure + provisioning + wa_reference: https://docs.oracle.com/en/solutions/oci-best-practices/best-practices-operating-cloud-deployments-efficiency.html + workload_monitoring: + passed: 1 + total: 2 + gaps: + - check_id: OPS-MON-003 + area: Workload Monitoring + finding: no centralized log analysis solution + severity: MEDIUM + recommendation: OCI Logging Analytics configured + wa_reference: https://docs.oracle.com/en/solutions/oci-best-practices/best-practices-operating-cloud-deployments-efficiency.html + os_management: + passed: 0 + total: 0 + gaps: [] + operations_support: + passed: 0 + total: 2 + gaps: + - check_id: OPS-SUP-001 + area: Operations Support + finding: no support plan consideration + severity: LOW + recommendation: Oracle support plan level specified and matches criticality + wa_reference: https://docs.oracle.com/en/solutions/oci-best-practices/best-practices-operating-cloud-deployments-efficiency.html + - check_id: OPS-SUP-002 + area: Operations Support + finding: no notification configuration + severity: MEDIUM + recommendation: OCI Notifications configured for operational events + wa_reference: https://docs.oracle.com/en/solutions/oci-best-practices/best-practices-operating-cloud-deployments-efficiency.html + distributed_cloud: + status: NOT_APPLICABLE + checks_passed: 0 + checks_total: 0 + categories: {} + action_items: + high_priority: + - check_id: SEC-IAM-001 + pillar: Identity & Access + finding: no IAM policy strategy defined or broad permissions used + recommendation: architecture specifies granular IAM policies per compartment/service + - check_id: SEC-IAM-002 + pillar: Identity & Access + finding: no MFA mentioned in identity setup + recommendation: MFA is specified in identity configuration + - check_id: SEC-IAM-003 + pillar: Identity & Access + finding: no mention of admin account restrictions + recommendation: separate admin groups defined for operations + - check_id: SEC-IAM-004 + pillar: Identity & Access + finding: stored credentials or API keys used for service accounts + recommendation: instance principals or resource principals specified for service-to-service + auth + - check_id: SEC-ISO-001 + pillar: Resource Isolation + finding: flat compartment structure or no compartment strategy + recommendation: hierarchical compartment structure defined + - check_id: SEC-ISO-004 + pillar: Resource Isolation + finding: user credentials used for cross-resource access + recommendation: resource principals used for cross-service access + - check_id: SEC-DAT-001 + pillar: Data Protection + finding: any storage service without encryption at rest + recommendation: encryption at rest specified for all storage services + - check_id: SEC-NET-002 + pillar: Network Security + finding: SSH open to 0.0.0.0/0 + recommendation: SSH access restricted to specific CIDR ranges or bastion + - check_id: SEC-MON-001 + pillar: Monitoring & Audit + finding: Cloud Guard not included in architecture + recommendation: Cloud Guard configured with appropriate recipes + - check_id: OPS-DEP-001 + pillar: Deployment Strategy + finding: no IaC strategy specified + recommendation: Terraform or Resource Manager specified for infrastructure provisioning + medium_priority: + - check_id: SEC-ISO-002 + pillar: Resource Isolation + finding: no tagging strategy defined + recommendation: defined tag namespaces with cost, environment, and owner tags + - check_id: SEC-DAT-002 + pillar: Data Protection + finding: using Oracle-managed keys or no key management strategy + recommendation: OCI Vault specified for key management + - check_id: SEC-NET-001 + pillar: Network Security + finding: only Security Lists used without NSGs + recommendation: NSGs used as primary network security mechanism + - check_id: SEC-NET-004 + pillar: Network Security + finding: OCI services accessed via internet gateway + recommendation: Service Gateway configured in VCN + - check_id: SEC-MON-002 + pillar: Monitoring & Audit + finding: audit service not mentioned or retention not configured + recommendation: Audit service enabled (enabled by default, verify retention) + - check_id: SEC-MON-003 + pillar: Monitoring & Audit + finding: no VCN Flow Logs configured + recommendation: VCN Flow Logs enabled for critical subnets + - check_id: PERF-CST-003 + pillar: Cost Management + finding: no budget alerts configured + recommendation: OCI Budgets configured with alert thresholds + - check_id: PERF-CST-004 + pillar: Cost Management + finding: no cost attribution tagging strategy + recommendation: cost-tracking tags defined and enforced + - check_id: OPS-MON-003 + pillar: Workload Monitoring + finding: no centralized log analysis solution + recommendation: OCI Logging Analytics configured + - check_id: OPS-SUP-002 + pillar: Operations Support + finding: no notification configuration + recommendation: OCI Notifications configured for operational events + low_priority: + - check_id: REL-SCL-002 + pillar: Scalability + finding: no service limit review planned + recommendation: service limit review mentioned in deployment plan + - check_id: OPS-SUP-001 + pillar: Operations Support + finding: no support plan consideration + recommendation: Oracle support plan level specified and matches criticality + references: + framework: https://docs.oracle.com/en/solutions/oci-best-practices/index.html + security: https://docs.oracle.com/en/solutions/oci-best-practices/effective-strategies-security-and-compliance1.html + reliability: https://docs.oracle.com/en/solutions/oci-best-practices/reliable-and-resilient-cloud-topology-practices1.html + operations: https://docs.oracle.com/en/solutions/oci-best-practices/best-practices-operating-cloud-deployments-efficiency.html + distributed: https://docs.oracle.com/en/solutions/oci-best-practices/effective-strategies-distributed-cloud-implementation1.html diff --git a/examples/output-demo-pharma-mx/opt06-feature-check.json b/examples/output-demo-pharma-mx/opt06-feature-check.json new file mode 100644 index 0000000..d956f7a --- /dev/null +++ b/examples/output-demo-pharma-mx/opt06-feature-check.json @@ -0,0 +1,92 @@ +[ + { + "feature": "Auto Indexing", + "category": "auto_management", + "compatibility": [ + { + "deployment": "ADB-S Serverless", + "version": "23ai", + "status": "GA_CAVEAT", + "notes": "Creates indexes HIDDEN by default. Instantly reversible. DML costing prevents over-indexing. Deduplication with manually created indexes." + }, + { + "deployment": "ADB-S Serverless", + "version": "26ai", + "status": "GA", + "notes": "Improved in 26ai \u2014 better cost model, fewer false positives." + }, + { + "deployment": "ADB-S Elastic Pool", + "version": "23ai", + "status": "GA_CAVEAT", + "notes": "Same as ADB-S Serverless." + }, + { + "deployment": "ADB Dedicated Elastic Pool (DEP)", + "version": "23ai", + "status": "GA_CAVEAT", + "notes": "Available but less tested in DEP." + }, + { + "deployment": "ADB on Dedicated Exadata", + "version": "23ai", + "status": "GA", + "notes": "Fully supported." + }, + { + "deployment": "Exadata Cloud Service", + "version": "23ai", + "status": "NOT_AVAIL", + "notes": "Not an ADB feature. Use manual indexing." + }, + { + "deployment": "Base DB Service (EE)", + "version": "23ai", + "status": "NOT_AVAIL", + "notes": "" + } + ] + }, + { + "feature": "AI Vector Search (HNSW)", + "category": "developer", + "compatibility": [ + { + "deployment": "ADB-S Serverless", + "version": "23ai", + "status": "GA_CAVEAT", + "notes": "HNSW indexes are node-local on multi-node RAC. Works well up to\n~50M vectors on single node (\u226424 ECPUs). At 100M+ on multi-node\n(\u226564 ECPUs), requires hash-partitioned vector table with LOCAL\nHNSW index for <50ms P95. See FF-202603-008.\n" + }, + { + "deployment": "ADB-S Serverless", + "version": "26ai", + "status": "UNTESTED", + "notes": "Check if distributed HNSW is added in 26ai. Expected to remain node-local." + }, + { + "deployment": "ADB-S Elastic Pool", + "version": "23ai", + "status": "GA_CAVEAT", + "notes": "Same node-local limitation as ADB-S Serverless." + }, + { + "deployment": "ADB on Dedicated Exadata", + "version": "23ai", + "status": "GA_CAVEAT", + "notes": "Same limitation. Dedicated infra doesn't change HNSW locality." + }, + { + "deployment": "Exadata Cloud Service", + "version": "23ai", + "status": "GA_CAVEAT", + "notes": "RAC with HNSW has same node-local constraint. Partitioning workaround applies." + }, + { + "deployment": "Base DB Service (EE)", + "version": "23ai", + "status": "NOT_AVAIL", + "notes": "AI Vector Search requires 23ai. Available in EE but HNSW performance limited without Exadata storage." + } + ] + } +] diff --git a/examples/output-demo-pharma-mx/opt07-competitive.json b/examples/output-demo-pharma-mx/opt07-competitive.json new file mode 100644 index 0000000..d17d195 --- /dev/null +++ b/examples/output-demo-pharma-mx/opt07-competitive.json @@ -0,0 +1,25 @@ +{ + "query": "ADB-S vs AWS Aurora PostgreSQL", + "aws_database_mappings": [], + "relevant_objections": [ + { + "id": "OBJ-001", + "category": "market", + "objection": "OCI is a niche cloud \u2014 AWS/Azure are the leaders", + "response": "OCI is the #4 cloud globally and growing fastest in database PaaS.\nFor Oracle database workloads specifically, OCI is the leader:\n- Only cloud with Exadata hardware\n- Only cloud with Autonomous Database\n- Best Oracle license portability\nThe question isn't \"best cloud overall\" but \"best cloud for this workload.\"\n", + "evidence": "Gartner, IDC reports on cloud database market" + }, + { + "id": "OBJ-004", + "category": "features", + "objection": "OCI doesn't have as many services as AWS", + "response": "True for breadth (AWS has 200+ services). For database and enterprise\nworkloads, OCI feature parity is strong. Key services are GA:\n- Compute, networking, storage, Kubernetes, serverless\n- Monitoring, logging, IAM, security\n- Queue, Streaming, API Gateway\nWhat matters is whether OCI has what *you* need, not a raw count.\n" + }, + { + "id": "OBJ-005", + "category": "cost", + "objection": "We can get better pricing from AWS/Azure", + "response": "OCI list prices are already 30-50% below AWS for equivalent configs.\nFor Oracle specifically:\n- No Oracle license surcharge on OCI\n- BYOL discount is deeper on OCI\n- Data egress is 10x cheaper\nRequest a detailed cost comparison with matched configurations.\n" + } + ] +} diff --git a/examples/output-demo-pharma-mx/opt08-business-case.pptx b/examples/output-demo-pharma-mx/opt08-business-case.pptx new file mode 100644 index 0000000..1f662f3 Binary files /dev/null and b/examples/output-demo-pharma-mx/opt08-business-case.pptx differ diff --git a/examples/output-demo-pharma-mx/opt09-field-findings-dep.json b/examples/output-demo-pharma-mx/opt09-field-findings-dep.json new file mode 100644 index 0000000..897c839 --- /dev/null +++ b/examples/output-demo-pharma-mx/opt09-field-findings-dep.json @@ -0,0 +1,121 @@ +[ + { + "id": "FF-202603-002", + "date": "2026-03-08", + "contributor": { + "name": "Diego Cabrera", + "team": "Field Architecture", + "client": "Strategic Migration Customer", + "context": "Production migration", + "confidence": "validated" + }, + "product": "ADB-S Dedicated Elastic Pool (DEP)", + "version": "23ai", + "severity": "HIGH", + "category": "limitation", + "summary": "ADG must be disabled before joining Dedicated Elastic Pool", + "detail": "When attempting to add an ADB-S instance with active Autonomous Data Guard\nto a Dedicated Elastic Pool, the operation fails. ADG must be explicitly\ndisabled before the instance can join the DEP. This is a known issue\nacknowledged by Oracle but not prominently documented.\n\nImpact: requires a brief HA gap during DEP onboarding. Must coordinate\nwith the customer's change window.\n", + "workaround": "Disable ADG \u2192 join DEP \u2192 re-enable ADG. Plan for ~15 min HA gap.", + "oracle_sr": "", + "status": "acknowledged", + "resolved_date": null, + "resolution": null, + "affects_matrix": "Elastic Pool Membership", + "tags": [ + "dep", + "adg", + "elastic-pool", + "ha", + "limitation" + ] + }, + { + "id": "FF-202603-003", + "date": "2026-03-05", + "contributor": { + "name": "Diego Cabrera", + "team": "Field Architecture", + "client": "Strategic Migration Customer", + "context": "Production migration", + "confidence": "validated" + }, + "product": "ADB-S Dedicated Elastic Pool (DEP)", + "version": "23ai", + "severity": "MEDIUM", + "category": "undocumented", + "summary": "DEP maintenance window immutable post-creation \u2014 change only via SR", + "detail": "The maintenance window for a Dedicated Elastic Pool cannot be changed\nafter creation via Console, CLI, or API. The only way to change it is\nby filing a Service Request with Oracle Support.\n\nDefault window is Saturday/Sunday. Other days require specifying at\ncreation time (which itself has the CLI bug \u2014 see FF-202603-001) or\nrequesting via SR.\n", + "workaround": "Set desired window at DEP creation time (via Console, not CLI). If missed, file SR.", + "oracle_sr": "", + "status": "acknowledged", + "resolved_date": null, + "resolution": null, + "affects_matrix": "Auto Patching", + "tags": [ + "dep", + "maintenance-window", + "immutable", + "sr-required" + ] + }, + { + "id": "FF-202603-004", + "date": "2026-03-01", + "contributor": { + "name": "Diego Cabrera", + "team": "Field Architecture", + "client": "Strategic Migration Customer", + "context": "Production migration", + "confidence": "validated" + }, + "product": "ADB-S", + "version": "23ai", + "severity": "MEDIUM", + "category": "gotcha", + "summary": "DEP provisioning takes days to weeks depending on capacity", + "detail": "Dedicated Elastic Pool provisioning is NOT instant like ADB-S Serverless.\nIt requires physical Exadata infrastructure allocation. Lead time varies\nfrom 3 days (if capacity available in region) to 2-3 weeks (if capacity\nneeds to be provisioned).\n\nBilling starts only at AVAILABLE state, not at request time.\nCo-location of existing ADB-S instances happens at the next maintenance\nwindow after joining, not immediately.\n", + "workaround": "Request DEP early in the project timeline. Don't make it a critical-path dependency in week 1.", + "oracle_sr": "", + "status": "acknowledged", + "resolved_date": null, + "resolution": null, + "affects_matrix": "Elastic Pool Membership", + "tags": [ + "dep", + "provisioning", + "lead-time", + "capacity", + "planning" + ] + }, + { + "id": "FF-202603-005", + "date": "2026-02-20", + "contributor": { + "name": "Diego Cabrera", + "team": "Field Architecture", + "client": "Strategic Migration Customer", + "context": "Production migration", + "confidence": "observed" + }, + "product": "ADB-S", + "version": "23ai", + "severity": "LOW", + "category": "gotcha", + "summary": "Refreshable Clone failed refresh leaves clone in AVAILABLE state \u2014 detection delay", + "detail": "When a Refreshable Clone's auto-refresh fails, the clone remains in\nAVAILABLE state (not DISCONNECTED). The Elastic Pool leader monitors\nlifecycle state changes, not refresh success/failure.\n\nThis means a failed refresh is NOT immediately detected by the\ninfrastructure. The stale data window equals the ADG RTO for\nunplanned scenarios.\n", + "workaround": "Planned switchovers: DBMS_PROXY_SQL.DISABLE_READ_ONLY_OFFLOAD proactively.\nUnplanned: OCI Events + OCI Function that monitors refresh state and\ndisables read offload automatically. Reduces stale window to ~ADG RTO.\n", + "oracle_sr": "", + "status": "monitoring", + "resolved_date": null, + "resolution": null, + "affects_matrix": "Refreshable Clone", + "tags": [ + "refreshable-clone", + "stale-reads", + "elastic-pool", + "detection-delay", + "proxysql" + ] + } +] diff --git a/examples/output-demo-pharma-mx/opt10-reference-arch-dr.json b/examples/output-demo-pharma-mx/opt10-reference-arch-dr.json new file mode 100644 index 0000000..e03c840 --- /dev/null +++ b/examples/output-demo-pharma-mx/opt10-reference-arch-dr.json @@ -0,0 +1,300 @@ +[ + { + "title": "Oracle MAA for Oracle Database@Azure", + "url": "https://docs.oracle.com/en/solutions/oracle-maa-db-at-azure/index.html", + "type": "reference-architecture", + "date": "2025-05", + "services": [ + "exacs", + "adg", + "vault", + "azure" + ], + "tags": [ + "database", + "multicloud", + "azure", + "ha-dr", + "autonomous" + ], + "summary": "Cross-AZ Data Guard on ExaCS in Database@Azure. Active Data Guard recommended for cross-AZ replication (block repair, app continuity, read offload). Backups to Autonomous Recovery Service.\n", + "terraform": null + }, + { + "title": "Implement disaster recovery with local and regional standbys on Oracle Database@Azure", + "url": "https://docs.oracle.com/en/solutions/local-regional-standby-dr-db-at-azure/index.html", + "type": "reference-architecture", + "date": "2025-05", + "services": [ + "exacs", + "adg", + "azure", + "fsdr" + ], + "tags": [ + "database", + "multicloud", + "azure", + "ha-dr" + ], + "summary": "Local standby for HA within same region, regional standby for DR across Azure regions. Uses Active Data Guard with Fast-Start Failover. Recommends Full Stack DR service for automated failover orchestration.\n", + "terraform": null + }, + { + "title": "Implement disaster recovery with multi-region standby on Oracle Database@Azure", + "url": "https://docs.oracle.com/en/solutions/multi-region-standby-dr-db-at-azure/index.html", + "type": "reference-architecture", + "date": "2025-04", + "services": [ + "exacs", + "adg", + "azure" + ], + "tags": [ + "database", + "multicloud", + "azure", + "ha-dr" + ], + "summary": "Multi-region DR for ExaCS on Database@Azure using Data Guard. Cross-region standby with switchover/failover capabilities. Includes network topology for Azure-to-Azure cross-region connectivity.\n", + "terraform": null + }, + { + "title": "Implement cross-region disaster recovery for Exadata Database on Oracle Database@Azure", + "url": "https://docs.oracle.com/en/solutions/exadb-dr-on-db-azure/index.html", + "type": "reference-architecture", + "date": "2025-01", + "services": [ + "exacs", + "adg", + "azure", + "fsdr" + ], + "tags": [ + "database", + "multicloud", + "azure", + "ha-dr" + ], + "summary": "Cross-region DR for ExaCS on Database@Azure. OCI-managed networks for peering (better performance, first 10 TB/month free). Data Guard for cross-region replication, FSDR for automated failover orchestration.\n", + "terraform": "https://github.com/oracle-quickstart/oci-multicloud-azure" + }, + { + "title": "Deploy Active Data Guard Far Sync to protect data across Oracle Database@Azure regions", + "url": "https://docs.oracle.com/en/solutions/active-data-guard-far-sync-oracle-db-at-azure/index.html", + "type": "reference-architecture", + "date": "2025-02", + "services": [ + "exacs", + "adg", + "azure" + ], + "tags": [ + "database", + "multicloud", + "azure", + "ha-dr" + ], + "summary": "Far Sync instance for zero data loss protection across Azure regions. Synchronous redo transport to Far Sync, async to remote standby. Eliminates performance impact of synchronous shipping over long distances.\n", + "terraform": null + }, + { + "title": "Implement Oracle Database Autonomous Recovery Service with Oracle Database@Azure", + "url": "https://docs.oracle.com/en/solutions/implement-recovery-service-db-at-azure/index.html", + "type": "reference-architecture", + "date": "2025-01", + "services": [ + "exacs", + "azure" + ], + "tags": [ + "database", + "multicloud", + "azure", + "ha-dr" + ], + "summary": "Autonomous Recovery Service for ExaCS backups on Database@Azure. Automated backup management with real-time protection and point-in-time recovery capabilities.\n", + "terraform": null + }, + { + "title": "Deploy Active Data Guard Far Sync to protect data across Oracle Database@AWS regions", + "url": "https://docs.oracle.com/en/solutions/dr-active-dg-farsync-db-at-aws/index.html", + "type": "reference-architecture", + "date": "2025-09", + "services": [ + "exacs", + "adg", + "aws" + ], + "tags": [ + "database", + "multicloud", + "aws", + "ha-dr" + ], + "summary": "Far Sync instance for zero data loss protection across AWS regions. Synchronous redo to local Far Sync, asynchronous to remote standby. Requires cross-region AWS networking for redo transport.\n", + "terraform": null + }, + { + "title": "Implement disaster recovery with local and regional standbys on Oracle Database@AWS", + "url": "https://docs.oracle.com/en/solutions/dr-local-regional-standby-db-at-aws/index.html", + "type": "reference-architecture", + "date": "2025-09", + "services": [ + "exacs", + "adg", + "aws", + "fsdr" + ], + "tags": [ + "database", + "multicloud", + "aws", + "ha-dr" + ], + "summary": "Local standby for HA within same AWS region, regional standby for DR. Active Data Guard with Fast-Start Failover for automated failover. Full Stack DR service for cross-service failover orchestration.\n", + "terraform": null + }, + { + "title": "Implement disaster recovery with cross-zonal Data Guard on Oracle Database@AWS", + "url": "https://docs.oracle.com/en/solutions/cross-zone-dr-db-at-aws/index.html", + "type": "reference-architecture", + "date": "2025-08", + "services": [ + "exacs", + "adg", + "aws" + ], + "tags": [ + "database", + "multicloud", + "aws", + "ha-dr" + ], + "summary": "Cross-AZ Data Guard on Database@AWS for HA. Synchronous redo transport between AZs for zero data loss. Fast-Start Failover for automatic database switchover on failure.\n", + "terraform": null + }, + { + "title": "Implement disaster recovery with cross-regional Data Guard on Oracle Database@AWS", + "url": "https://docs.oracle.com/en/solutions/implement-dr-cross-region-dg-odb-aws/index.html", + "type": "reference-architecture", + "date": "2025-08", + "services": [ + "exacs", + "adg", + "aws" + ], + "tags": [ + "database", + "multicloud", + "aws", + "ha-dr" + ], + "summary": "Cross-region Data Guard on Database@AWS for DR. Asynchronous redo transport for cross-region replication. Planned switchover for maintenance, forced failover for disaster scenarios.\n", + "terraform": null + }, + { + "title": "Migrate Oracle RAC Databases to OCI", + "url": "https://docs.oracle.com/en/solutions/ensure-ha-migrate-vmware-workloads-to-oci/migrate-oracle-rac-databases1.html", + "type": "reference-architecture", + "date": "2025-01", + "services": [ + "exacs", + "exascale", + "adb-d", + "base-db" + ], + "tags": [ + "database", + "migration", + "ha-dr" + ], + "summary": "Compares 4 RAC migration targets: ExaCS Dedicated, Exascale, ADB-D, and 2-node RAC on Base DB. ExaCS recommended for full RAC feature parity. Exascale for 23ai-only without dedicated infra commitment.\n", + "terraform": null + }, + { + "title": "Configure Data Guard for Oracle Exadata Database Service on Dedicated Infrastructure", + "url": "https://docs.oracle.com/en/solutions/dataguard-exadata-dedicated-infrastructure/index.html", + "type": "reference-architecture", + "date": "2025-07", + "services": [ + "exacs", + "adg" + ], + "tags": [ + "database", + "ha-dr" + ], + "summary": "Data Guard configuration for ExaCS Dedicated. Active Data Guard for read offload and automatic failover. Cross-region standby for DR with Fast-Start Failover for automated switchover.\n", + "terraform": null + }, + { + "title": "Back up from Exadata on Dedicated Infrastructure to Zero Data Loss Autonomous Recovery", + "url": "https://docs.oracle.com/en/solutions/back-up-exadata-dedicated-zero-data-loss-recovery/index.html", + "type": "reference-architecture", + "date": "2025-07", + "services": [ + "exacs" + ], + "tags": [ + "database", + "ha-dr" + ], + "summary": "Autonomous Recovery Service for ExaCS backups. Automated backup management with real-time redo protection. Validates backup recoverability automatically.\n", + "terraform": null + }, + { + "title": "Configure a standby database for disaster recovery using Oracle Exadata Database Service on Cloud@Customer", + "url": "https://docs.oracle.com/en/solutions/exadata-cloud-at-customer-standby/index.html", + "type": "reference-architecture", + "date": "2025-07", + "services": [ + "exacs", + "adg" + ], + "tags": [ + "database", + "ha-dr" + ], + "summary": "Data Guard standby on ExaCS Cloud@Customer for hybrid DR. On-premises primary with cloud standby, or cloud primary with on-premises standby for data sovereignty requirements.\n", + "terraform": null + }, + { + "title": "Learn about maximum availability architecture for PeopleSoft", + "url": "https://docs.oracle.com/en/solutions/learn-about-maa-for-peoplesoft/index.html", + "type": "reference-architecture", + "date": "2024-08", + "services": [ + "exacs", + "adg", + "load-balancer", + "compute" + ], + "tags": [ + "application", + "ha-dr", + "peoplesoft" + ], + "summary": "MAA for PeopleSoft on OCI. Active Data Guard for database HA/DR, multi-instance PIA behind Load Balancer, Process Scheduler on multiple nodes for batch processing resilience.\n", + "terraform": null + }, + { + "title": "Provision and deploy a maximum availability solution for PeopleSoft on Oracle Cloud", + "url": "https://docs.oracle.com/en/solutions/deploy-maa-for-peoplesoft-on-oci/index.html", + "type": "reference-architecture", + "date": "2024-08", + "services": [ + "exacs", + "adg", + "load-balancer", + "compute" + ], + "tags": [ + "application", + "ha-dr", + "peoplesoft" + ], + "summary": "Step-by-step PeopleSoft MAA deployment on OCI. Terraform stacks for infrastructure provisioning, Data Guard configuration, and PeopleSoft application tier setup.\n", + "terraform": null + } +] diff --git a/examples/output-demo-pharma-mx/opt11-finding-verify.json b/examples/output-demo-pharma-mx/opt11-finding-verify.json new file mode 100644 index 0000000..c4cf727 --- /dev/null +++ b/examples/output-demo-pharma-mx/opt11-finding-verify.json @@ -0,0 +1,33 @@ +[ + { + "id": "FF-202604-001", + "date": "2026-04-12", + "contributor": { + "name": "Carlos Mendoza", + "team": "Field Architecture", + "date": "2026-04-12", + "confidence": "validated", + "client": "PharmaCorp Mexico", + "context": "ExaCS migration" + }, + "reported_by": "Carlos Mendoza", + "product": "ExaCS", + "version": "23ai", + "severity": "MEDIUM", + "category": "gotcha", + "summary": "ExaCS iormcal fails silently when storage server count < 3 \u2014 validate IORM plan after apply", + "detail": "IORM resource plan apply succeeds but actual I/O shares are not enforced when storage count < 3. Check v$iorm_plans for actual vs requested allocation.", + "workaround": "Always validate IORM plan output after apply. Check v$iorm_plans for actual vs requested shares. Minimum 3 storage servers for reliable IORM.", + "oracle_sr": "", + "status": "open", + "resolved_date": null, + "resolution": null, + "affects_matrix": null, + "tags": [ + "exacs", + "iorm", + "storage" + ], + "confirmations": [] + } +] diff --git a/examples/output-demo-pharma-mx/opt11-report-finding.txt b/examples/output-demo-pharma-mx/opt11-report-finding.txt new file mode 100644 index 0000000..6088bbc --- /dev/null +++ b/examples/output-demo-pharma-mx/opt11-report-finding.txt @@ -0,0 +1,4 @@ +WARNING: Unknown tag 'iorm'. Not in taxonomy. +WARNING: Unknown tag 'storage'. Not in taxonomy. + +Added: FF-202604-001 [MEDIUM] ExaCS iormcal fails silently when storage server count < 3 — validate IORM plan after apply diff --git a/examples/output-demo-pharma-mx/opt12-ecal-readiness.json b/examples/output-demo-pharma-mx/opt12-ecal-readiness.json new file mode 100644 index 0000000..bfa097e --- /dev/null +++ b/examples/output-demo-pharma-mx/opt12-ecal-readiness.json @@ -0,0 +1,175 @@ +{ + "summary": { + "total_artefacts": 18, + "mentioned": 2, + "likely_relevant": 0, + "possibly_relevant": 9, + "not_covered": 7, + "skill_auto_generate": 5, + "skill_assist": 2 + }, + "artefacts": [ + { + "id": "DEF-01", + "name": "Customer Profile", + "phase": "define", + "step": "ideate", + "skill_support": "assist", + "customer_facing": false, + "relevance": "possibly_relevant" + }, + { + "id": "DEF-02", + "name": "Strategy Map", + "phase": "define", + "step": "ideate", + "skill_support": "assist", + "customer_facing": false, + "relevance": "none" + }, + { + "id": "DEF-03", + "name": "Point of View (PoV)", + "phase": "define", + "step": "ideate", + "skill_support": "auto_generate", + "customer_facing": false, + "relevance": "possibly_relevant" + }, + { + "id": "DEF-04", + "name": "Ideation Workshop", + "phase": "define", + "step": "ideate", + "skill_support": "reference", + "customer_facing": true, + "relevance": "possibly_relevant" + }, + { + "id": "DEF-05", + "name": "Business Case", + "phase": "define", + "step": "ideate", + "skill_support": "auto_generate", + "customer_facing": true, + "relevance": "mentioned" + }, + { + "id": "DEF-06", + "name": "Value Story", + "phase": "define", + "step": "ideate", + "skill_support": "auto_generate", + "customer_facing": true, + "relevance": "mentioned" + }, + { + "id": "DEF-07", + "name": "Value Story Delivery", + "phase": "define", + "step": "validate", + "skill_support": "assist", + "customer_facing": true, + "relevance": "possibly_relevant" + }, + { + "id": "DEF-08", + "name": "Joint Engagement Plan (JEP)", + "phase": "define", + "step": "plan", + "skill_support": "auto_generate", + "customer_facing": true, + "relevance": "possibly_relevant" + }, + { + "id": "DES-35", + "name": "Solution Proposal", + "phase": "design", + "step": "confirm", + "skill_support": "auto_generate", + "customer_facing": true, + "relevance": "none" + }, + { + "id": "DES-36", + "name": "Partner / Services Proposal", + "phase": "design", + "step": "confirm", + "skill_support": "reference", + "customer_facing": true, + "relevance": "none" + }, + { + "id": "DES-37", + "name": "RFx Response", + "phase": "design", + "step": "confirm", + "skill_support": "reference", + "customer_facing": true, + "relevance": "none" + }, + { + "id": "DES-38", + "name": "Commercial Agreement", + "phase": "design", + "step": "confirm", + "skill_support": "reference", + "customer_facing": true, + "relevance": "none" + }, + { + "id": "DEL-17", + "name": "Cloud Operating Framework", + "phase": "deliver", + "step": "operate", + "skill_support": "reference", + "customer_facing": true, + "relevance": "possibly_relevant" + }, + { + "id": "DEL-18", + "name": "OCI Operationalization Framework", + "phase": "deliver", + "step": "operate", + "skill_support": "reference", + "customer_facing": true, + "relevance": "none" + }, + { + "id": "DEL-19", + "name": "Retrospective", + "phase": "deliver", + "step": "improve", + "skill_support": "auto_generate", + "customer_facing": false, + "relevance": "none" + }, + { + "id": "DEL-20", + "name": "Value Realization", + "phase": "deliver", + "step": "improve", + "skill_support": "auto_generate", + "customer_facing": true, + "relevance": "possibly_relevant" + }, + { + "id": "DEL-21", + "name": "Customer Success Story", + "phase": "deliver", + "step": "improve", + "skill_support": "reference", + "customer_facing": true, + "relevance": "possibly_relevant" + }, + { + "id": "DEL-22", + "name": "Improvement Actions", + "phase": "deliver", + "step": "improve", + "skill_support": "reference", + "customer_facing": true, + "relevance": "possibly_relevant" + } + ] +} diff --git a/examples/output-demo-pharma-mx/opt13-bom.xlsx b/examples/output-demo-pharma-mx/opt13-bom.xlsx new file mode 100644 index 0000000..c0a3425 Binary files /dev/null and b/examples/output-demo-pharma-mx/opt13-bom.xlsx differ diff --git a/examples/output-demo-pharma-mx/opt14-bom-appca.xlsx b/examples/output-demo-pharma-mx/opt14-bom-appca.xlsx new file mode 100644 index 0000000..5f71733 Binary files /dev/null and b/examples/output-demo-pharma-mx/opt14-bom-appca.xlsx differ diff --git a/examples/output-demo-pharma-mx/proposal-spec.yaml b/examples/output-demo-pharma-mx/proposal-spec.yaml new file mode 100644 index 0000000..5518243 --- /dev/null +++ b/examples/output-demo-pharma-mx/proposal-spec.yaml @@ -0,0 +1,401 @@ +# OCI Deal Accelerator — Proposal Spec +# Demo: Pharma Mexico — ExaCS migration from on-prem Exadata X6 +# Prompt 1: Full proposal + +metadata: + customer: "PharmaCorp Mexico" + project: "Oracle Database Migration to OCI" + subtitle: "ExaCS Migration — Exadata X6 to OCI" + architect: "Carlos Mendoza" + firm: "Oracle Cloud Infrastructure" + date: "2026-04-12" + +summary: + why: > + PharmaCorp Mexico operates 3 Oracle databases (EBS R12, SAP, DW) on on-premises + Exadata X6 hardware approaching end-of-life. Hardware refresh costs $1.8M and + locks into 5 more years of on-prem operations. Migration to OCI ExaCS provides + 30%+ cost reduction, eliminates hardware lifecycle management, improves DR posture + (RPO<15min, RTO<1h), and enables SOX compliance alignment with Oracle-managed + infrastructure patching. + current_state: + - "3 Oracle DBs on Exadata X6 (EBS R12 prod, SAP, Data Warehouse)" + - "200 concurrent users, peak during fiscal close" + - "2TB total data across all databases" + - "No DR — single site in Mexico City data center" + - "Manual patching quarterly — SOX audit finding pending" + - "HW refresh due in 6 months ($1.8M quote)" + target_state: > + OCI ExaCS X11M in Queretaro (prod) with Data Guard standby in Sao Paulo for + cross-region DR. Hub-spoke networking via DRG, dual FastConnect 10Gbps for + redundancy, WAF for web applications, OCI Vault for TDE key management. + SOX compliance via automated patching and audit logging. + timeline: "Migration Q3-Q4 2026 (16 weeks) — conditional on board approval Q2" + +service_tiering: + - name: "EBS R12 Production" + tier: "Platinum" + uptime: "99.99%" + rto: "1 hour" + rpo: "15 minutes" + justification: "Business-critical ERP — fiscal close depends on this" + - name: "SAP Database" + tier: "Gold" + uptime: "99.95%" + rto: "4 hours" + rpo: "1 hour" + justification: "Critical but lower user count" + - name: "Data Warehouse" + tier: "Silver" + uptime: "99.9%" + rto: "8 hours" + rpo: "4 hours" + justification: "Reporting — can tolerate longer recovery" + +architecture_principles: + design: + - id: "D-01" + name: "Operational Simplicity" + summary: "Prefer managed services with automated patching" + rationale: "SOX requires documented patching — ExaCS automates this" + - id: "D-05" + name: "HA for Business Continuity" + summary: "Design for HA proportional to business impact" + rationale: "EBS is Platinum tier — needs cross-region DR" + - id: "D-06" + name: "Defense in Depth" + summary: "Multiple security layers, not single perimeter" + rationale: "SOX compliance requires network segmentation + encryption + audit" + deployment: + - id: "P-01" + name: "Infrastructure as Code" + summary: "All infrastructure defined in Terraform" + rationale: "Reproducible environments, audit trail for SOX" + +architecture: + description: > + Dual-region ExaCS deployment: Queretaro (primary) + Sao Paulo (DR standby). + Hub-spoke networking with DRG provides segmented VCNs for each workload tier. + Dual FastConnect 10Gbps from Mexico City provides redundant connectivity. + WAF protects EBS web tier. OCI Vault manages TDE encryption keys externally. + + Key components: + - ExaCS X11M Quarter Rack in Queretaro (3 databases) + - Data Guard to ExaCS standby in Sao Paulo (EBS + SAP) + - Hub VCN with DRG for inter-spoke routing + - Dual FastConnect 10Gbps from Mexico City DC + - WAF for EBS R12 web access + - OCI Vault for TDE key management (SOX) + - OCI Logging + Audit for compliance + visual: + regions: + - name: "Queretaro (Primary)" + services: + - name: "ExaCS X11M (3 DBs)" + type: "database" + - name: "Hub VCN + DRG" + type: "networking" + - name: "WAF" + type: "security" + - name: "OCI Vault" + type: "security" + - name: "Sao Paulo (DR)" + services: + - name: "ExaCS Standby (Data Guard)" + type: "database" + - name: "Spoke VCN" + type: "networking" + +decisions: + - title: "ExaCS over ADB-S" + decision: "Use ExaCS instead of ADB-S for all 3 databases" + rationale: > + EBS R12 requires OS-level access for patches and customizations. + SAP on Oracle requires specific Oracle features not available on ADB-S. + DW benefits from ExaCS storage performance. All 3 share the same + Exadata infrastructure for cost efficiency. + alternatives: "ADB-S (rejected — EBS needs OS access), DBCS (rejected — no Exadata performance)" + + - title: "Cross-Region DR with Data Guard" + decision: "Active Data Guard from Queretaro to Sao Paulo" + rationale: > + RPO<15min requires real-time redo shipping. Sao Paulo provides geographic + separation for disaster scenarios. Data Guard supports automatic failover + with FSDR for RTO<1h. + alternatives: "Backup/restore (rejected — RPO 24h), Same-region standby (no geo separation)" + + - title: "Hub-Spoke Networking" + decision: "Hub VCN with DRG for inter-spoke routing and segmentation" + rationale: > + SOX requires network segmentation between environments. Hub-spoke with DRG + provides centralized security controls (WAF, NSG) while isolating workloads. + alternatives: "Flat VCN (rejected — no segmentation for SOX)" + + - title: "Dual FastConnect" + decision: "Two 10Gbps FastConnect circuits from Mexico City" + rationale: > + Single FastConnect is a documented single point of failure. Dual circuits + provide redundancy for the EBS production workload. + alternatives: "Single FastConnect + IPSec VPN backup (acceptable for lower tiers)" + + - title: "OCI Vault for TDE Keys" + decision: "External key management via OCI Vault instead of Oracle Wallet" + rationale: > + SOX requires separation of duties for encryption key management. + OCI Vault provides FIPS 140-2 Level 3 HSM-backed key storage. + alternatives: "Oracle Wallet on ExaCS (simpler but no separation of duties)" + +ha_dr: + description: > + Primary in Queretaro with Active Data Guard to Sao Paulo. FSDR orchestrates + failover for RTO<1h. EBS and SAP databases replicated; DW rebuilt from backup + in DR scenario (Silver tier — 8h RTO acceptable). + tiers: + - tier: "Platinum — EBS R12" + technology: "ExaCS + Active Data Guard + FSDR automatic failover" + rto: "1 hour" + rpo: "15 minutes" + - tier: "Gold — SAP" + technology: "ExaCS + Active Data Guard" + rto: "4 hours" + rpo: "1 hour" + - tier: "Silver — DW" + technology: "ExaCS + RMAN backup to Object Storage" + rto: "8 hours" + rpo: "4 hours" + +security: + controls: + identity: + - "OCI IAM with federated identity (SAML 2.0 to corporate AD)" + - "Separate admin compartments per environment" + - "MFA required for all admin operations" + - "Break-glass emergency access procedures" + network: + - "Hub-spoke VCN with DRG — workload isolation" + - "WAF for EBS R12 web tier" + - "NSG rules per spoke — deny-all default" + - "Dual FastConnect — no public internet exposure" + data_protection: + - "TDE encryption at rest with OCI Vault (FIPS 140-2 L3)" + - "Encryption in transit (TLS 1.2+ / native Oracle Net encryption)" + - "Data Guard redo encryption" + monitoring: + - "OCI Audit for all API calls (SOX)" + - "OCI Logging for network flows" + - "Database Audit with Unified Auditing" + - "OCI Events + Notifications for security alerts" + compliance: + - "SOX — automated patching, audit logging, separation of duties" + +environment_catalogue: + environments: + - name: "Production (Queretaro)" + sizing: "ExaCS X11M Quarter Rack — 3 databases (EBS, SAP, DW)" + isolation: "Dedicated Exadata infrastructure" + cost_pct: 100 + - name: "DR Standby (Sao Paulo)" + sizing: "ExaCS X11M Quarter Rack — 2 databases (EBS, SAP standby)" + isolation: "Dedicated Exadata infrastructure" + cost_pct: 70 + - name: "Pre-Production" + sizing: "DBCS VM — reduced sizing for testing" + isolation: "Shared infrastructure, separate compartment" + cost_pct: 15 + cost_notes: + - "DR standby runs at 70% — Active Data Guard requires matching shape" + - "Pre-prod uses DBCS VMs, not ExaCS — sufficient for functional testing" + - "Dev/Test environment excluded — customer uses on-prem for dev" + +cost: + line_items: + - component: "ExaCS X11M Quarter Rack — Queretaro (Prod)" + monthly_payg: "$18,500" + monthly_byol: "$8,200" + notes: "2 DB servers, 3 storage servers, BYOL" + - component: "ExaCS X11M Quarter Rack — Sao Paulo (DR)" + monthly_payg: "$18,500" + monthly_byol: "$8,200" + notes: "ADG standby, BYOL" + - component: "ADB-S 16 ECPU (DW alternative — future)" + monthly_payg: "$2,400" + monthly_byol: "$1,200" + notes: "Optional — migrate DW to ADB-S in Phase 2" + - component: "FastConnect 10Gbps Dual" + monthly_payg: "$3,060" + notes: "2 x $1,530/month" + - component: "OCI Vault" + monthly_payg: "$500" + notes: "HSM-backed key management" + - component: "Object Storage (50TB backup)" + monthly_payg: "$1,200" + notes: "RMAN backups + DW backup" + - component: "WAF + Logging + Monitoring" + monthly_payg: "$800" + notes: "WAF for EBS web tier + audit logging" + - component: "TOTAL" + monthly_payg: "$45,000" + monthly_byol: "$23,200" + notes: "BYOL saves 48%" + assumptions: + - "BYOL assumes existing Oracle Database EE licenses with active support" + - "ExaCS pricing based on current OCI list prices" + - "DR standby at full rate (ADG requires active compute)" + - "No middleware licensing included (EBS app tier on compute VMs)" + - "FastConnect partner charges not included" + show_byol: true + +cost_comparison: + title: "Cost Comparison: On-Prem HW Refresh vs OCI Migration" + col_headers: ["Component", "On-Prem Refresh (5yr)", "OCI ExaCS BYOL", "Delta"] + rows: + - item: "Infrastructure (hardware/cloud)" + current: "$1,800,000 upfront" + oci: "$278,400/yr" + savings: "Break-even at 3.2 years" + - item: "Annual Support & Maintenance" + current: "$220,000/yr" + oci: "Included in OCI" + savings: "-100%" + - item: "DR Infrastructure" + current: "$0 (no DR today)" + oci: "$98,400/yr" + savings: "New capability — no DR today" + - item: "Data Center (power/cooling/space)" + current: "$80,000/yr" + oci: "$0" + savings: "-100%" + - item: "DBA Operations (patching)" + current: "$60,000/yr (part-time DBA)" + oci: "$0 (automated)" + savings: "-100%" + - item: "TOTAL ANNUAL (year 1)" + current: "$2,160,000" + oci: "$376,800" + savings: "-83%" + - item: "TOTAL 3-YEAR TCO" + current: "$2,880,000" + oci: "$1,130,400" + savings: "-$1.75M (61%)" + +migration: + phases: + - name: "Phase 1: Foundation" + duration: "4 weeks" + milestones: + - "OCI tenancy + networking provisioned" + - "ExaCS Quarter Rack deployed in Queretaro" + - "FastConnect dual circuits active" + - "OCI Vault + IAM configured" + - name: "Phase 2: EBS Migration" + duration: "6 weeks" + milestones: + - "EBS R12 database migrated via ZDM" + - "Data Guard to Sao Paulo configured" + - "WAF + network security validated" + - "SOX audit controls verified" + - name: "Phase 3: SAP + DW Migration" + duration: "4 weeks" + milestones: + - "SAP database migrated" + - "DW migrated + Data Guard for SAP" + - "RMAN backup for DW to Object Storage" + - name: "Phase 4: Cutover + Decommission" + duration: "2 weeks" + milestones: + - "Production cutover (planned downtime window)" + - "On-prem Exadata X6 decommissioned" + - "Go-live monitoring active" + tools: + - "Oracle Zero Downtime Migration (ZDM)" + - "Data Guard Broker for DR setup" + - "FSDR for failover orchestration" + - "Terraform OCI provider for IaC" + downtime: "Planned 4-hour maintenance window for final cutover per database" + +operational_raci: + model: "co_managed" + raci_items: + - activity: "ExaCS Infrastructure Patching" + oracle: "R" + customer: "I" + - activity: "Database Patching (quarterly)" + oracle: "C" + customer: "R" + - activity: "Data Guard Monitoring" + oracle: "C" + customer: "R" + - activity: "Backup & Recovery" + oracle: "R" + customer: "C" + - activity: "Security (IAM, NSG, Vault)" + oracle: "C" + customer: "R" + - activity: "SOX Audit Evidence" + oracle: "C" + customer: "R" + - activity: "Capacity Planning" + oracle: "C" + customer: "R" + - activity: "Incident Response (Sev1)" + oracle: "C" + customer: "R" + +risks: + - risk: "EBS R12 customizations may require OS-level changes post-migration" + severity: "HIGH" + probability: "Medium" + mitigation: "Inventory all customizations pre-migration; test in Pre-Prod" + - risk: "FastConnect provisioning delay (partner-dependent)" + severity: "MEDIUM" + probability: "Medium" + mitigation: "Start FastConnect provisioning in Phase 1 week 1; IPSec VPN as interim" + - risk: "SAP certification on ExaCS version" + severity: "MEDIUM" + probability: "Low" + mitigation: "Verify SAP Note for ExaCS X11M support before migration" + - risk: "Data Guard network latency Queretaro-Sao Paulo" + severity: "LOW" + probability: "Low" + mitigation: "Test redo apply lag; async mode acceptable for SAP (Gold tier)" + - risk: "SOX audit during migration window" + severity: "MEDIUM" + probability: "Medium" + mitigation: "Maintain dual-write during transition; both systems auditable" + +scorecard: + pillars: + - name: "Security & Compliance" + status: "PASS" + passed: 24 + total: 26 + - name: "Reliability & Resilience" + status: "PASS_WITH_RECOMMENDATIONS" + passed: 7 + total: 8 + - name: "Performance & Cost" + status: "PASS" + passed: 5 + total: 5 + - name: "Operational Efficiency" + status: "PASS_WITH_RECOMMENDATIONS" + passed: 9 + total: 10 + - name: "Distributed Cloud" + status: "NOT_APPLICABLE" + passed: 0 + total: 0 + recommendations: + - "45/49 checks passed — strong architecture for regulated workload" + - "Add runbook for Data Guard failover testing (quarterly DR drill)" + - "Consider OCI Database Management for centralized fleet monitoring" + - "Define capacity growth plan for fiscal close peak periods" + +next_steps: + steps: + - "Board approval for OCI migration budget — CFO — by 2026-05-15" + - "Provision OCI tenancy + ExaCS in Queretaro — Carlos Mendoza — by 2026-06-01" + - "Start FastConnect provisioning with partner — Network team — by 2026-06-01" + - "EBS customization inventory and Pre-Prod testing — DBA team — by 2026-06-15" + - "Schedule SOX audit coordination meeting — Compliance — by 2026-06-01" + contact_info: "Carlos Mendoza — Solutions Architect, Oracle Cloud Infrastructure" diff --git a/tools/gen_demo_deck.py b/tools/gen_demo_deck.py new file mode 100644 index 0000000..c525af7 --- /dev/null +++ b/tools/gen_demo_deck.py @@ -0,0 +1,334 @@ +#!/usr/bin/env python3 +""" +OCI Deal Accelerator — Demo Presentation Generator + +10-minute technical demo deck: AI-powered SA workflow acceleration. +Uses Oracle FY26 template via OraclePresBase. +""" + +import sys +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).parent)) + +from pptx.util import Inches, Pt +from pptx.dml.color import RGBColor +from pptx.enum.text import PP_ALIGN, MSO_ANCHOR +from pptx.enum.shapes import MSO_SHAPE + +from oci_pptx_base import Colors, Layouts, OraclePresBase + + +class DemoDeckGenerator(OraclePresBase): + TITLE_ACCENT_COLOR = Colors.TEAL + MARGIN = Inches(0.5) + SLIDE_WIDTH = Inches(13.333) + + def add_cover(self): + """Slide 1: Cover — dark, high impact.""" + slide = self._add_layout_slide(Layouts.COVER_DARK) + self._set_placeholder(slide, 0, "OCI Deal Accelerator") + self._set_placeholder(slide, 1, + "AI-Powered Architecture Proposals in Hours, Not Days") + return slide + + def add_impact_slide(self, metric, statement, detail=""): + """Big metric slide — dark background, single number.""" + slide = self._add_layout_slide(Layouts.IMPACT_DARK) + self._set_placeholder(slide, 0, metric) + self._set_placeholder(slide, 1, statement) + if detail: + self._set_placeholder(slide, 37, detail) + return slide + + def add_content_slide(self, title, bullets, note=""): + """Standard content slide with title bar + bullet list.""" + slide = self._add_blank_slide() + self._add_title_bar(slide, title, margin=self.MARGIN) + + y = Inches(1.4) + txBox = self._add_textbox( + slide, self.MARGIN + Inches(0.1), y, + Inches(12), Inches(5), + text="", font_size=15, + ) + tf = txBox.text_frame + tf.word_wrap = True + # First paragraph already exists + tf.paragraphs[0].text = bullets[0] if bullets else "" + tf.paragraphs[0].font.size = Pt(15) + tf.paragraphs[0].font.name = self.FONT + tf.paragraphs[0].font.color.rgb = Colors.PRIMARY_TEXT + tf.paragraphs[0].space_after = Pt(6) + + for b in bullets[1:]: + self._add_paragraph(tf, b, font_size=15, space_after=6) + + if note: + self._add_textbox( + slide, self.MARGIN, Inches(6.5), + Inches(12), Inches(0.5), + text=note, font_size=11, italic=True, + color=Colors.SECONDARY_TEXT, + ) + return slide + + def add_prompt_table_slide(self, title, rows): + """Slide with a table of option # | prompt example.""" + slide = self._add_blank_slide() + self._add_title_bar(slide, title, margin=self.MARGIN) + + n = len(rows) + 1 + row_h = min(0.52, 5.2 / max(n, 1)) + table = self._add_table( + slide, n, 3, + self.MARGIN, Inches(1.3), + Inches(12.3), Inches(row_h * n), + ) + table.columns[0].width = Inches(0.6) + table.columns[1].width = Inches(3.0) + table.columns[2].width = Inches(8.7) + + for j, h in enumerate(["#", "Capability", "Live Prompt"]): + self._style_table_cell( + table.cell(0, j), h, font_size=10, bold=True, + color=Colors.WHITE, bg_color=Colors.TEAL, + alignment=PP_ALIGN.CENTER if j == 0 else PP_ALIGN.LEFT, + ) + + for i, (num, cap, prompt) in enumerate(rows): + ri = i + 1 + bg = Colors.TABLE_ALT_ROW if ri % 2 == 0 else None + self._style_table_cell(table.cell(ri, 0), str(num), font_size=10, + bold=True, bg_color=bg, alignment=PP_ALIGN.CENTER) + self._style_table_cell(table.cell(ri, 1), cap, font_size=10, + bold=True, bg_color=bg) + self._style_table_cell(table.cell(ri, 2), prompt, font_size=9, + bg_color=bg) + + return slide + + def add_before_after_slide(self): + """Before/After comparison slide.""" + slide = self._add_blank_slide() + self._add_title_bar(slide, "Before vs After: SA Workflow", margin=self.MARGIN) + + # BEFORE column + self._add_rect(slide, self.MARGIN, Inches(1.4), + Inches(5.8), Inches(0.5), fill_color=Colors.ORACLE_RED) + self._add_textbox(slide, self.MARGIN + Inches(0.2), Inches(1.45), + Inches(5.4), Inches(0.4), + text="BEFORE — Manual SA Workflow", + font_size=14, bold=True, color=Colors.WHITE) + + before = [ + ("Discovery call", "1h"), + ("Research services + sizing", "2-4h"), + ("Build architecture diagram", "1-2h"), + ("Write proposal deck", "3-5h"), + ("Cost estimate + BOM", "1-2h"), + ("WA review (if time permits)", "2-3h"), + ("Internal review + revisions", "1-2h"), + ("TOTAL", "11-19 hours (2-3 days)"), + ] + + y = Inches(2.0) + for task, time in before: + bold = task == "TOTAL" + color = Colors.ORACLE_RED if bold else Colors.PRIMARY_TEXT + self._add_textbox(slide, Inches(0.7), y, Inches(3.8), Inches(0.32), + text=task, font_size=11, bold=bold, color=color) + self._add_textbox(slide, Inches(4.6), y, Inches(1.5), Inches(0.32), + text=time, font_size=11, bold=bold, color=color, + alignment=PP_ALIGN.RIGHT) + y += Inches(0.35) + + # AFTER column + self._add_rect(slide, Inches(6.8), Inches(1.4), + Inches(5.8), Inches(0.5), fill_color=Colors.FOREST) + self._add_textbox(slide, Inches(7.0), Inches(1.45), + Inches(5.4), Inches(0.4), + text="AFTER — AI-Assisted Workflow", + font_size=14, bold=True, color=Colors.WHITE) + + after = [ + ("Discovery call", "1h"), + ("Paste notes → Full proposal", "3-5 min"), + ("Architecture diagram", "included"), + ("Slide deck (18 slides)", "included"), + ("Cost estimate + BOM", "included"), + ("WA review (5-pillar)", "included"), + ("SA reviews AI output", "30-60 min"), + ("TOTAL", "1.5-2 hours (same day)"), + ] + + y = Inches(2.0) + for task, time in after: + bold = task == "TOTAL" + color = Colors.FOREST if bold else Colors.PRIMARY_TEXT + self._add_textbox(slide, Inches(7.0), y, Inches(3.8), Inches(0.32), + text=task, font_size=11, bold=bold, color=color) + self._add_textbox(slide, Inches(11.0), y, Inches(1.5), Inches(0.32), + text=time, font_size=11, bold=bold, color=color, + alignment=PP_ALIGN.RIGHT) + y += Inches(0.35) + + # Savings callout + self._add_rect(slide, Inches(3.5), Inches(5.3), + Inches(6.3), Inches(0.7), fill_color=Colors.TEAL) + self._add_textbox(slide, Inches(3.6), Inches(5.35), + Inches(6.1), Inches(0.6), + text="85% time reduction | Same day delivery | Higher quality (WA-validated)", + font_size=14, bold=True, color=Colors.WHITE, + alignment=PP_ALIGN.CENTER) + + return slide + + def add_divider(self, text): + slide = self._add_layout_slide(Layouts.DIVIDER_DARK) + self._set_placeholder(slide, 0, text) + return slide + + +def build_demo_deck(output_path): + gen = DemoDeckGenerator() + + # ── SLIDE 1: Cover (0:00-0:15) ── + gen.add_cover() + + # ── SLIDE 2: The Problem — impact (0:15-1:00) ── + gen.add_impact_slide( + "11-19h", + "Time an SA spends per proposal", + "Research + diagram + deck + costs + review — repeated for every deal" + ) + + # ── SLIDE 3: The Aha Moment (1:00-2:00) ── + gen.add_before_after_slide() + + # ── SLIDE 4: What Is It (2:00-3:00) ── + gen.add_content_slide( + "OCI Deal Accelerator — What Is It?", + [ + "An AI skill (system prompt + knowledge base + tools) for any LLM with tool-use and 100K+ context", + "Works on Claude, Codex, GPT, Gemini — any model that can read files + run Python", + "Aligned with ECAL framework: Define > Design > Deliver", + "40+ YAML files of field knowledge (services, sizing, pricing, patterns, gotchas)", + "7 Python generators: .pptx, .drawio, .pdf, .xlsx, WA scorecard, BOM, AppCA", + "14 capabilities accessible via natural language — not a chatbot, a domain-specific SA tool", + ], + ) + + # ── SLIDE 5: Divider — Live Demo (3:00) ── + gen.add_divider("Live Demo: 14 Capabilities") + + # ── SLIDE 6: Prompts 1-7 (3:00-6:00) ── + gen.add_prompt_table_slide( + "Design, Validate & Compare (Options 1-7)", + [ + ("1", "Full proposal", + "Cliente farmaceutico en Mexico, 3 Oracle DBs (EBS R12 prod, SAP, DW) en " + "Exadata X6 on-prem. HW refresh vence en 6 meses. Quieren migrar a OCI, " + "RPO<15min, RTO<1h, necesitan compliance SOX. 200 usuarios concurrentes, " + "2TB data, pico en cierre fiscal. Budget: reducir 30% vs renovar HW."), + ("2", "Architecture diagram", + "Diagrama: ExaCS en Queretaro (prod) + Standby con Data Guard en Sao Paulo, " + "Hub-Spoke networking con DRG, FastConnect 10Gbps dual desde Mexico City, " + "bastion en public subnet, WAF para apps web, Vault para TDE keys."), + ("3", "Slide deck", + "Genera el deck para la propuesta del cliente farmaceutico."), + ("4", "Cost estimate", + "ExaCS X11M Quarter Rack BYOL, 2 DB servers, 3 storage servers, " + "400GB RAM, 10TB usable + ADB-S 16 ECPU + FastConnect 1Gbps dual + " + "50TB Object Storage + OCI Vault. 12 meses, 40% descuento."), + ("5", "WA review", + "Review: ADB-S 23ai en Sao Paulo region unica, IAM con admin por defecto, " + "sin encryption at rest explicita, sin WAF, monitoring con scripts custom, " + "patching manual mensual, backup solo local, sin network segmentation."), + ("6", "Feature check", + "Does ADB-S Dedicated Elastic Pool support Auto Indexing on 23ai? " + "And what about AI Vector Search with HNSW indexes at 100M+ vectors?"), + ("7", "Competitive", + "Customer comparing ADB-S vs AWS Aurora PostgreSQL for a mixed OLTP+analytics " + "workload, 500GB, needs partitioning, RAC equivalent, and BYOL licensing. " + "They think Aurora is cheaper. Give me honest pros and cons."), + ], + ) + + # ── SLIDE 7: Prompts 8-14 (6:00-8:30) ── + gen.add_prompt_table_slide( + "Strategy, KB, Governance & SA Tools (Options 8-14)", + [ + ("8", "Business case", + "Business case: 5 Oracle DBs on-prem (EBS, Siebel, DW, 2 custom), " + "$1.2M/yr infra (HW refresh vence Q3). CTO quiere cloud, CFO quiere " + "numeros. Necesito TCO 3 anos, ROI, risk of doing nothing, y que pasa " + "si renuevan HW por 5 anos mas. Audience: board de directores."), + ("9", "Field findings", + "What real issues has the field team found with ADB-S Dedicated Elastic " + "Pool? Include DEP provisioning times, maintenance windows, and ADG."), + ("10", "Reference arch", + "Reference architectures for cross-region DR with Exadata and Data Guard. " + "Need options for both ExaCS and ADB-S with automatic failover."), + ("11", "Report finding", + "New finding: ExaCS iormcal fails silently when storage server count < 3. " + "Product: ExaCS, Version: 23ai, Severity: MEDIUM, found during pharma " + "engagement in Mexico. Workaround: validate IORM plan output after apply, " + "check v$iorm_plans for actual vs requested shares."), + ("12", "ECAL readiness", + "Score this engagement: tenemos discovery notes, workload profile, y un " + "diagrama de arquitectura. No hay business case, no value story, no " + "handover plan, no operations model. Customer es farmaceutica en Mexico, " + "engagement tier standard, estamos en la fase Design."), + ("13", "BOM generator", + "BOM: ExaCS X11M Half Rack BYOL, 4 DB servers 128 ECPUs each, " + "6 storage servers, ADB-S 32 ECPU, 50TB block storage, " + "FastConnect 10Gbps dual, OCI Vault, 12 months, 45% discount."), + ("14", "BOM for AppCA", + "Same BOM as 13 but in AppCA import format for deal approval."), + ], + ) + + # ── SLIDE 8: Architecture (8:30-9:00) ── + gen.add_content_slide( + "How It Works — Under the Hood", + [ + "SKILL.md: 400-line system prompt with ECAL-aligned workflow rules", + "kb/: 40+ YAML files — services, sizing, pricing (auto-refreshed), patterns, gotchas", + "tools/: 7 Python generators that produce real files, not markdown", + "Oracle FY26 .pptx template with Redwood design system colors", + "scripts/: WA validation engine against 5-pillar framework (80+ checks)", + "Field findings tracker with contributor attribution + confidence levels", + "SKU catalog refreshed from Oracle public pricing API", + ], + note="Everything is composable: patterns combine, KB is the moat, field experience > documentation" + ) + + # ── SLIDE 9: Key Takeaways (9:00-9:30) ── + gen.add_content_slide( + "Key Takeaways", + [ + "85% time reduction: from 2-3 days to 2 hours per proposal", + "Higher quality: every proposal is WA-validated with 5-pillar scoring", + "Field knowledge compounds: gotchas and findings feed back into the KB", + "ECAL-aligned: Define > Design > Deliver with artefact tracking", + "Real deliverables: .pptx, .drawio, .pdf, .xlsx — not chat summaries", + "SA stays in control: AI generates, architect reviews and refines", + ], + ) + + # ── SLIDE 10: Closing ── + gen.add_closing_slide( + name="OCI Deal Accelerator", + title="github.com/your-org/oci-deal-accelerator", + ) + + gen.save(output_path) + print(f"Generated: {output_path}") + print(f" Slides: {gen.slide_count}") + print(f" Duration: ~10 minutes") + + +if __name__ == "__main__": + out = sys.argv[1] if len(sys.argv) > 1 else "demo-presentation.pptx" + build_demo_deck(out)