From fa716073b3bfe02fb07b0ae090332ba13140c659 Mon Sep 17 00:00:00 2001 From: Thamilvendhan Munirathinam <37844963+mthamil107@users.noreply.github.com> Date: Wed, 12 Aug 2026 22:30:52 +0530 Subject: [PATCH] Correct Governed Memory (Taheri) attribution; print arXiv IDs in refs Remove the fabricated "Co-memorize" pattern attribution to Taheri's Governed Memory (arXiv:2603.17787), which describes automated governance for autonomous agents with no human-in-the-loop gate. Reframe it as a contrast across the paper (.md/.tex + arXiv bundle), README, CITATION.cff, and the launch assets. Also fix the bibliography so arXiv IDs are actually followable: plain.bst silently drops eprint/archivePrefix/primaryClass, so add note = {arXiv:ID} to all five arXiv entries. Correct Taheri primaryClass cs.MA -> cs.AI and delete the stale "TODO verify" comment. Regenerate the arXiv tarball. CITATION.cff: replace the invented title and placeholder author with the real values (Hamed Taheri; "Governed Memory: A Production Architecture for Multi-Agent Workflows"). --- CITATION.cff | 13 +++++++------ README.md | 6 +++++- docs/MCP-RELATIONSHIP.md | 4 ++-- docs/launch-post.md | 2 +- docs/launch/01-tweet-thread.md | 2 +- docs/paper/arxiv-submission.tar.gz | Bin 86269 -> 86371 bytes .../arxiv-submission/memorywire-paper.tex | 14 +++++++------- docs/paper/arxiv-submission/memorywire.bib | 16 ++++++++++------ docs/paper/memorywire-paper.md | 14 +++++++------- docs/paper/memorywire-paper.tex | 14 +++++++------- docs/paper/memorywire.bib | 16 ++++++++++------ docs/spec/v0.md | 2 +- 12 files changed, 58 insertions(+), 45 deletions(-) diff --git a/CITATION.cff b/CITATION.cff index 6873303..0228de9 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -85,18 +85,19 @@ references: description: "arXiv preprint identifier" url: "https://arxiv.org/abs/2402.17753" - type: article - title: "Governed Memory: Human-in-the-Loop Co-memorize for Long-Lived Agent Memory" + title: "Governed Memory: A Production Architecture for Multi-Agent Workflows" authors: - - name: "Governed Memory authors (see arXiv listing)" + - family-names: "Taheri" + given-names: "Hamed" year: 2026 identifiers: - type: other value: "arXiv:2603.17787" - description: "arXiv preprint identifier (per docs/kickoff/FINDINGS-CONTEXT.md; verify on arXiv before publication)" + description: "arXiv preprint identifier" notes: >- - Citation transcribed from project kickoff notes. The diff-and-approve - workflow in memorywire's governance channel draws on the Co-memorize HITL - pattern surfaced in this paper. + memorywire's human-in-the-loop diff-and-approve governance contrasts with + this line of work, which enforces memory governance automatically for + autonomous multi-agent workflows rather than through a human-approval gate. - type: software title: "Model Context Protocol (MCP)" authors: diff --git a/README.md b/README.md index ad859c6..9ca550b 100644 --- a/README.md +++ b/README.md @@ -383,7 +383,11 @@ uv pip install pytest pytest-asyncio pytest-cov ruff mypy Modelled on [MCP](https://modelcontextprotocol.io) (cross-vendor protocol shape), informed by the [LongMemEval](https://arxiv.org/abs/2410.10813), [LoCoMo](https://arxiv.org/abs/2402.17753), and Governed Memory papers, and by the published architecture writeups of mem0, Letta, Cognee, Zep/Graphiti. -The diff-and-approve workflow draws on the Co-memorize HITL pattern surfaced in the *Governed Memory* literature. +The diff-and-approve workflow mirrors code review and change-management gates; +what memorywire adds is its standardization at the wire-format layer. This contrasts +with automated governance for autonomous agents such as +[Governed Memory](https://arxiv.org/abs/2603.17787), which enforces write policy +without a human gate. ## Prior work and naming diff --git a/docs/MCP-RELATIONSHIP.md b/docs/MCP-RELATIONSHIP.md index b3cbdcf..ce8d7f8 100644 --- a/docs/MCP-RELATIONSHIP.md +++ b/docs/MCP-RELATIONSHIP.md @@ -348,5 +348,5 @@ references. - Cloudflare Web Bot Auth Internet-Draft precedent — `draft-meunier-web-bot-auth-architecture` (IETF). The ship-spec-then-propose-upstream pattern memorywire follows. -- "Governed Memory" (arXiv 2603.17787) — the Co-memorize HITL - pattern that informs memorywire's governance channel. +- "Governed Memory" (arXiv 2603.17787) — automated governance for autonomous agents, + the human-gated contrast to memorywire's governance channel. diff --git a/docs/launch-post.md b/docs/launch-post.md index 8f08c27..88dd003 100644 --- a/docs/launch-post.md +++ b/docs/launch-post.md @@ -64,7 +64,7 @@ This is the piece I most want operators to test, because it has the strongest st A `remember` with `approval_required: true` stages the row behind a sentinel (`PENDING_APPROVAL_DELETED_AT = -1` in `memories.deleted_at`) so it cannot influence recall until a human approves. The Pro-tier UI (Starlette + HTMX, source-available under FSL 1.1, auto-converts to Apache-2.0 after 2 years) renders the pending memory with a structured diff against the closest live counterpart; the reviewer approves or rejects; the decision is journaled into an append-only audit log keyed by `approved_by`. The same flow covers `forget` and `merge`. An approval-learning loop sits on top: track which patterns the reviewer always approves or rejects and auto-allow after N consistent decisions. -This matters because *memory governance is becoming a compliance problem*, not just a quality-of-life one. EU AI Act transparency / human-oversight, HIPAA audit-trail expectations on systems that persist patient context, SOC2 data-handling — all assume you can answer "what does this system remember, who decided, and when?" Today, with no protocol-level governance primitive across memory frameworks, the answer is "instrument each framework separately." memorywire's channel is one place to instrument and one log to query. The closest published precedent is the Co-memorize HITL pattern from the *Governed Memory* paper (arXiv 2603.17787); memorywire's contribution is shipping it as protocol surface and a working UI. +This matters because *memory governance is becoming a compliance problem*, not just a quality-of-life one. EU AI Act transparency / human-oversight, HIPAA audit-trail expectations on systems that persist patient context, SOC2 data-handling — all assume you can answer "what does this system remember, who decided, and when?" Today, with no protocol-level governance primitive across memory frameworks, the answer is "instrument each framework separately." memorywire's channel is one place to instrument and one log to query. The diff-and-approve discipline itself mirrors code review; memorywire's contribution is shipping it as protocol surface and a working UI. This contrasts with automated memory governance for autonomous agents such as *Governed Memory* (arXiv 2603.17787), which enforces write policy without a human gate. ## Security in one paragraph diff --git a/docs/launch/01-tweet-thread.md b/docs/launch/01-tweet-thread.md index 4c023bd..049c952 100644 --- a/docs/launch/01-tweet-thread.md +++ b/docs/launch/01-tweet-thread.md @@ -44,7 +44,7 @@ Empirical numbers in the paper: ## 4/6 ``` -The piece I leaned on most: every remember() can stage behind a human-review queue with a structured diff against current memory state. The Co-memorize / Governed Memory pattern, productized. +The piece I leaned on most: every remember() can stage behind a human-review queue with a structured diff against current memory state. Human-in-the-loop governance, productized as protocol surface — unlike automated approaches such as Governed Memory (arXiv 2603.17787), the human stays in the gate. Full threat model in the paper §6 — 6 adversaries mapped to OWASP + CWE. ``` diff --git a/docs/paper/arxiv-submission.tar.gz b/docs/paper/arxiv-submission.tar.gz index b5e8e51665f5a98e297859cf3227b54a739e0fe7..94321e57de835b61d435e7495564bb2cd181bdf0 100644 GIT binary patch delta 50824 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 VeXXzcwZ6XQ^)C=?i?{$-0sv8#gC76@ delta 50746 zcmWKXhhNf(|Hps#?aFJIS6x|}dJVNS_0pWETxV%zYH4aN$lMEZlAwH=TA5NVa%b+n zK|vt1+=?3&f!qTD7oZ^e>wkDZ-tX7z`Fg!)zU-Ie?yr9JdY{{5V^ZvEeSk#W+umjV z*_UbP(>|dN1XMuSH}bgl_o5XkL1i;j8e)Be#v4J*$giqEc*FHM(_zU^4z8s1-b3$- z#+gPDPTfd89vqI^cnJYe*F>B*8CFI@6UkJ`mRHwy&Gs@o+6X!ksn2Dwqt8SxQL8u; z1Tv>RYyU|T^GunudTikPPX|=0tINJoQloRr8wenDz53V=_ta|o`*nMt!0eSeT)pqj zCl!OB$Blrd%Vn_5mjMSozDs?svw7J(F4rBemfy=NRU!}%R#%*k*#ZPeX?A>S%xO#HLngLsiUHv98b zj7o48^6p)AqMv2_8PIthDz&)b2?H0KR=4ooGkmfE5a#PD(P5`0p1vM>zEJyf;o9ELo43w<4l`? z5qGmsjjfp(Cz~^Ay_zSn=;E%}a89Yw*&$8Wq~X=vtvTiKK^&1#53MqAJ7};TpF;cw zj0SO{Vbwtbk+0vjDEfG6^JbSz#G+u!zMYNFa{RK;mucCpl-i_EcDWZ@#$hMNi^nzm zCMu7*C8WF;5Y)$#z;Kq^Z3#**9NDB40qc*lf0*HvrYrtl{=V{qeNzo!D17;ne)0DN z(VWLJRHiO0i_sRhu;Z9{L{`hD`A=Z?$^3}dVVe<|)o^t5BfF7Znih{0EgCOZazwWa z{a9Xzm97*wDPo0lq`|Gpy?`g8bjS#z4e#4u2)rd=O0jRaDjNppL)j;gH4{}%Z0F}R zpDf5ciqLbCwQ(>V=T@k6#$m?Xb>6>-@+v`_=jUVD3~>(Ob*L85c;rZ+@G<{F_cYN7 zzW5ib+S>Q)w*#0;jSc@Mad1`f+DBYnyUeFkk_plcx=}-jbIO{GNPWN|)XLf2(Lc$F zV^wmT2rs-DdnliyP=7J6=~j4><8OF5`V{gv#cxq zwl3Y=B~RtSEC?E$d#XS|9Gh=pXAUc^Mn8~Vt8G6f?{ZUY)3f9#egm@w)d)FJ#ArTq?Lb@`+O?AokASPl3=wK%2v{t9X~vZOI02(|O+ zO`mwg-B4q&%kvCZc*KVEXk~^Z?xyA3Pa!IepHNMm` zl^^O>j`=(I&&)jeW|cCXj+AeE*UFD6hzKr=iGucOqZh?^SHWYiX{DPN`wzy%$JwbTLvplt zfT6OC90byBYiH_j&G!yCAMA@mS0O%yVPy>}(52zrT!ar>&530>t9eJQ_zybGzp-p# zv-+b3-5N3!WIHMOIe3kaK{M(i1n z;e?fJ@u=I{HjKFFZC7+TMsVAV!h`{PrW+lY{1kAk{!=%=39|d8<#z1}uyu1BNOYl( zAG%YcB&*5Xwa;=YkT;Y@#g2*IXN97<>n%qa2~-kck!wZozn!6vHOy)#X#cv?Rlz1l z;pZaKA{W{Ocdcrn)%6F(>mhZR-z&232W>aLCB3l0(6Qlnf`#W;r|h?fp?7yK0ks6}B<|HdLi6KoBAAHiz!is?88A&Nk6pGy+z= zy{jx7;c(5+AouWvyL4Hfx>4!ViAE9q&`Ev$9ZssVN`!a+TS}D*r)Euh%eL;ObYySR zP$hcuDVbBn1v`&~m7YTYiq3XUsIel|A=@C=wj&heIUiF~M*EkeytDdaehgt|*>yIL z9F5o9A@JwqEeQ{z5KX8(({mRr`YIYW)(P7uMh|ckqZ+Tdhho&6Ji6w)m`}fIzP&>_ zy~K>X6-K$;en6NbS%be^?wIkN@@Rjb0w+EQzO3p~26kNdCIx@OJl0zYT?bX^)>5p<>Os<)eYC)pgKPh5^Jb zQrOYEKEizqHvn6s#DaUYnQkq#BE8mmNNl0?Mb$KO?IH`^KMtx8X2!d%*G#og#q-QV zfs&?hz0J2kW_9%N`dskaq*Ud-yJNUAMuNu1iF8wWm!>%CBN-bR>e}MYY|oy7=@Vx> z){K&Q2;;i;W3QbPZe6ur7A}>w=l`83b4Dq_^{j`!XFJClddI@T_=ILB#W%)weOA z{;wf>|LyVtx1ku%gk^z|3gJKOcq~s^ElJETt6@!DqT$}ELq%6Em6br|9Sg<(E8`0D zfSpoL#-$__DZah`a9Se9BAdp;b#8c^>D;ypfas@BZZ0OthJPU{Wl}_`-$je-9uuNg zoc$K#d~rD|w~)BZ$H%9Uu8?|Tq}$YcYxj^6?hiGZcFKa|WxQy*?607>LzALXOmyn&v%<)U~Q3Gyw&myROcKJ454@`e=>bh_xq&FiW^97FKax z;(LS{yeIf5d!Z`}QzD%6F1Vb%WMP*Lph58UX-kutBvvWfu|j8V2J-!9z-5|=8d0>a z&Ty)_*-|t*YKzVY-M+8H$sXTkR5d`iEP;xC*u((p>Do@!ircE_|ETw)1gNwr1&xJwV z{LK2U@F%qI6)3no(&6ZvkP2h=e^J+2nE@I}g|xIr&CrQ*&386hFzXDQ-SWeY`?b8< z$pJ%+(l@_fuuM;PHGKsXo@dCvD;z8qSG-o-PlNVmY<`Ag`}?v?^YLlNM6jLosfe73 zO1Xc69&?5gSO=6EmZQQg>Ep-pM(f9)tVHXl#Y@tXK5Ei7h4PU*uAds~#N=EJIoMY5 zfFCQ$wOjyVL^M9SaD08=V>OB|`o~;nsdJjufkV+Cs=AUOcMW*eYexx;A_d3wcL$4x znbuTr7!%y!@7prCDqo^oJ0uvEeyB^>%~VuH7q>5(`s6os8WV!dW;{~#y?x$~j2Brb zP7DW;8$9C9tkL&MKh)io_#wspaVLJT>vwg`ecm%EL2vd7G*LNss(8AGEt8 z^|2x~D48y3UKn0_@-)wFG5|mJ?~Kmjlzjdd6^E0@-BGVlkut*pw;T)Sr0IVzaRjQlz%%!D}iH(*BI zDC?OrRO%z|gY!a)>{>WdD1%;froBnS_!HJdEH2BxVbe2Z&|)IrfV1&N4k)d*r8fE5 z^E?{7s&beS6GKz+KD0bSk4hCq!4wzLS;epid-ArkcG-D$b9_L@RjS7)vMpUK~)+c9Rht@Np27mnaXMp9|`m=FXDQwL*1Q=}dkD=s_`jP7XqC}M(Y z{Z~pgCqQeUsiDSkNo~lyZ>ZzOhgS46>VlHoUmz;-)r#nNyY&!SxE=qsG0&p&smyD zY51Mmo?luyEfyREcf~mWc9`nO07UiZR>PEXxtJ^z(qy707HHY(AWqRPVfGbNnkd}E zb(-%Pe2l)!LIL!wEJPWBu&nX| z)O;pNGHk!c!O>a~m7*y!Z3$9C@ldP=%6uic$ zBePH>^1m+r%yHNO{AWq%UfaajGk!3r{mLz8wecCbNk1b0jk=X=`9lo_0xrq!=e)E1 zDJPkY-L3Jwng8oehUJY8LmyVrF;PP}O)R?6fRGCGY;z-4!f*Wet*u{eADkOKe$9w0 znreM$N00It$|_}VzzueKU_qjRVe*JR?|Eox*4gxQqv$73)84P;qWSZDYDr}EPX3E} zUV8rb%ZRqVPmqm;%$+$<;r_^a(5d0(fVt+H_Bx#j#PBoX)J@@3<;%hMIteSt51Xa% zuxvn>Xd<|d2*6o0w6FbpHLNf5EWcy{zM!iRz{d@)6QPijQK-lk?CktuJNTBZGLKz^ zIlFBfE}2Y1TN)jS8anl0Ohp;G)ALWGW?ZkU*GRtx}4lG4c5^BK90IS96w+hahg1)UCO-b)4EdVaVfr_0wNn%u$ z4gW+PMYdq8h&RNk%-2QHn;iIh~7x49JF9PUqg{o$z zC7E`6`8vmrpHzW=+UjFZt!qQVUugOo-3?5c-xjiTS;|&t-9i}c>W2fVWjf@7@H8il zisyyY9X-dnxjR*k;F56(5Gwp(mNV}b$9jH=cdt)zukp5NUh4MIv-i9|u_f-0i%w~V zDr4IaWpY1P`qkAoLPT$;JSyybq(9lxtX9ie-^~u^$t71Bdnr66(1Ol#ob9qJQDON% zOIqd{;T4ew=yrNd-C$<(#6^-|Z|I-obc zdH3&!G8LVL;{GwY^lfQo_`490_Tx=K>Os{A!Nb6$rjY5Ky9)X-)IG!5o;Y-?V>xCyePE!h z{TYD~GU2)gHI*!tE84%>$|)yJ*DWc0BjWrAVYJ@m{{yz;)Y8~Tlzx2H{YMbD5godg zMSC5qaQfv>=kaVCRX82|+MnH~63mQTfN9lwXJcKbf8ei4nN7!^OGRamY!5PJbm4rB4Y=L-DXy zz%heqU)Fgrmc`{0PeI)Jq#y(-ud^ph6D1cWf{#tX@-ji zG1Wct968d=c7nvn2JjBVIWJ*?in?}pVdbImoKnJ>SX}%iHt-0MW~k*O3?$^jjHUON zgI!^QhaNqf&jxOFuDKBkmhZY1pq>MBYMXuxylVs$`4nkWh9r!X`pH*n?x}T_XS=BU z6HOb*4w}y*gF;-Ey9pN$91FkPzC?E<4y}Lp*(krGs-dJ|La7mKjD+44XLEPIz^qTz zrLY+<9Yc1UsYio;>d#*9bEz88teap36Mxboe&oKIN&a)x>a6CTaqd!_MH--|vyqz0 z%5QcN|C=W$+tZ|=Hd*`QjN(;2);T6)3uX!wivpKedWC^&MQ(dlbWl1ssNdh&tU%uE zTZ*x{ZtqaTglvTxi{Rt(QYGlg-VUlY2GbO5kQaO)l0j(F0%>iVJW8CM8xMj~VkSdf za|4&xz83_<*#Hb^_{ZEGpqLi_x|iwMZcNlR7Or$mIQ8abxt==U#50MQPUaKkSKLfy z?cfJK!+y@EAIyfiN{yoH}b@bU`=lxWZt`GndGrla?+F%Pmh-V6v~(9mY`y zOEhXFdh|Pa=Y{_I*wIa#Ly{&xM2TNJInVCvM5vMiY6zlpWn21y9k0#nuAJhW+(K4x zXFan2k7h$sh9@JS(KXt;ql=xj5h5&?s3j~RZi?F4f$K?wZ1HSV6|o3DKJ#yW(5Xga zEVJfaK9ZJBzLxDGbQ1NXJV4q{Hqv$ zH%IY0Jc^bn-z*>K`-malg00h8IyUXXrM>$A*LE?pL5Y8GTeB=RE* z_bDH^iXa)eDg{y&&aP?ozEc=SiUjE1FBYl9ke^X^GHLh;gg1xnF!goxPG>?iq-AX% z^PxMUg*qNTp*~~e?ASdPI^_R&u+lQOff5gyr_s7f$1iv796gG4StuY-iKWB0{%5@q zhz6dL+83{Tn9rLi$m@ywD~L%;2M=wb{eeo+?(s4;sb=fTTCUv3%euk#4Q!LZm!_H@ z!X~`!ki#0vqukUZegNV2%VKJHLyBInti2`lYKTkRnUUC) zK(SHqvl17?nHk&9RHh~172nwBddnZr$-A;Wb4Uf5l)Yl=7O;XE<- zbGh00#AX2+Kvj7!x+F)6zMc>|`swDnq!sGo1xo2C-J1WGQ+JRB5g^73j$n!@I;9@Sn z2M4_Qr62G+U2(OAcwn>c(SX_6p$Sn)Hk;GdF#1Yy4S99d0&FqV4zMA&UF02Va9{>x zYV_x?JCOHM|Hxi5NIbvWVxkW48gQHJS}6L`;gGw^DC=N++|!0H0bjcesFB|->#A*% zPO5{ObfYhtWFXtB2A(mT_TPTDAxkI>=cLh>+D^o#+hIEp%qvxiSSr7cnMkssZ}1nF zQV3_WNBKUTvRVMynP1x2fXE05J#{%qsA-5@_2ReuX^`QVcfxB!2(378n!8zC)5@!5 z>{$I;g<%TIFn$A?M_8%@>lHsWfZb@1K1VYulp!MF)1pl~D-lLcQ#F@SV^HnveRAA z_ZKG0^J|m!w&)&WapTR<2B86DyWJW)z*HKBh7*-oL~?ZiVfRPbVAJ7I4N8vAXV=Lu z3qTwYPLP!H+x(rLk1{(Ow8FV-q9wC{&&73ZePzfT2RG(P(i*)u__y9sC|yGM+>&~1 z-yF2C>HB`SWc~+f%$dPJ(VCR(tdx$tjni(0q&z7_3PBAD=5Y#t#bTc7UsPqNKy-P4 zGbC#$0{x%-$bgX16}IOt8@x6uyj=r~fRQ}_0oFU6JV1$(3-5511VI<1uyPj;Bj@cY z*S}>Y!81(nu4dbaLW^-P2h0LO_;CH-qn zI(gmkM}E#Z4!tn92iGsyFP;nM_=F#}t|UFF$Z-=(S-~F2obr;n6*4wI&0Os1_ytB{ zN2QB>`UU)?_!GT3&EF~~mi2UT^esw&fhsTP3x`yERakVu#HvP#)sm(}|=dI;x+?Ru6XEpiRMV!8}j3bqs532f#8*_8Vn0YKe{_YF){D!Y^OcNu@E3fsTqn<9W0>!u5{X3QI1s?Om6(UojEreI2 zH+?m}Tr1-!p7Hbv3?Fg^pkK+}{89AN{CUV%(<;5f+zjdgJash^>s7aacw8`bvh=8K zQ`2tLHph7yZ9zno2;quWsEsMXS2it?xVxxdKi_q|UFWFv@`nVohV8@M@zth856jJG z<&`wREcTVq^hr5jZk@9aB$tZm8>3G$buUhTSgGR9S$75cIGzEt1Lt?VbYL#)%RI^^{GZj)6A+72zc#71?KR^Ma$(0Pk?#2U-Q-f$w?`$tsGwkc?OC z`zNS6*#Dk&Sg!kex?R=r48s}w{KgpTFxknJulTDkaq+mZjNl9 zch^fUuyDJD{+w!1K5CK14oJ!22itOyl}X7<9KEEK>kpNbX80_^knGP!n?}r&-X3ds0bk|(JQZKouTij z{GO2Em2q6&c(;od3q_DKh`?Onz4-yqh|F#TzRu}PYVya^&V0tETaXJ)?UF%LhZrkq z8DdzgeeG3j7#Z&bp4&nqS8_EFHWSzU&k>IyjD6f*HYTC8f&!y1Xsva_*&6$KaKJ=Z zw#2w&Q}NQ_K~rP_ZD891Al(irYb@@r%PG9x`^`1_f7Y_YdViF+0Vn^^YMuz&>}`CH zmGY;mP9<%(Dv<(a!~JP)bY;o`?&-}ZW1XF?dCt2%Fw)k{)JtBv=@ayyep-=+->*W` zQ!}8|kHfF8_rW_sEdH+T_5yiVrZS%i9`*AP{TFK^jeSZLLn=9McHWGU941z+0w|eb z2?i87Y)$F?awv)26+=T*jC{DZG&yB3q@vGp!-e}};>hxqi=U_`a4(O+Ee3pJl z?OSe4W?wEnMP7_8l8N9{p`1P9aN#kZ(-7)##&A=vma_e70kKv#8bhh4=t>m_tVMxIzIlVr{)B~Ov zsFMYjN z9Gh4l22&J_ACHdM^cymf5UDPc}EYJ#}|Blzb7oT+nld9A6p_bTZ+{#&Y3++0u*@8OFa z9ULd-#uId=Wyj7=TU0D`E?Ubk0WQO;)RgD5#c7R?;C0I%C+r`kmf(8-c%Z6V|wlw@@+Ts`y>VAa78Y!u&}tX z&Ze#M&ywZ4ku^ImL#_efvbnlIyo+BrUosGq<^}tX zVs*NquWVZGRO-z}J80zTzOj@-kIj@gg5g=Q>6$-feD|0o zhqe@Z3xojfWd#OSx-AU}v3i}+=%2xTj1{qqhtVNnssuEtT+!M>@gmS~{e(1#_*@W>KF2YkT7S6_0pteLwhN)J1we(%qQb54|=4BR36PuKL+hdhq$ zjpp_Qv8>Xs8a2GA{_!FwXroAS=V@V^9slkX#-{ns?jS=3ZrRME8Q9cs@u(@x2bf)r zj5To{mFb-0KmXh`qfE3rz8vvONSNB#1n2~*0ep(=YPpP@Rmo&PRkP;xBOpYpkh%fE zq(weJ3s5Ol95@{iK&_QCsikZrB0e`&z<1fCl?5#N1BE{`zsB_lZwQXWB5oI@41VD5C^D~ zSFqk6u+n14jde3sxoGCh5Ra{9KWF5a4@)V3U;0g*PYFWvMek{ouU`)GO`4-5*<7tO zo&^qR5t3!$2i8lrHi;x~1b)()g9#CO5776|iBxb@+YIT+d~)dL`B(1h5bt(le`vRN z+km^(9m=9RW5~vKmjIkcRQZUe>%AHaGe{34tKn z8V2Sde>&w2q+D;MbEnVk>>B;>85|drUXjT7ve8E?xhJecKT4t-T)FL)(P|`Xqc9hV z`$An|EXDNw*tOM2-v*OVM-QyqH%=4BF>2ze&x2>>ytWP^C&~Pm`*6c8jY(r<^WqC? zVX95hu6hfjvvy}1&ZEy7h(yx`7!5H{WmIJLdv^DTUJQ9yfy$vhwQB5#Z5hIfRP`=@%o zIeeR*9vt>{GrOtVGAqgsy;o^y5zl%sr6n*iME_oXgA%U;tP+q zsF-GT+`Q7HjA>Zr5H^RZAfF`@qOq+lZk!8k^Vf{G8hc6Bnuq&h=+G|l8Hdt4E;;`b z?pMdpbE=eH4oIu34@(DziSHC$I3_hClWb{U7-%vJCfoY9q-o2@Fr)al23oeiu`z6U zf*!z*x=f0&7Y|sd__8-)c6GhqX&zeS^^L88h}~sNBHo5+XM|{DBX|(w#Jg&HE8hlU z8|06yD-dVWdT{814<%_;2aKBTF53@WMKMxt&$tM!QuP>)HLwD!1|we2iExN%L~3)J zZPVv2HOhsL`ZseTjwpc0-9ne?ks`VR(9_36(4N5HJ+a)khr_Aeo3G#ZvQfYT*!mS+ zx6vpx%UfDV3P9y~ZhkSkPs+abCS$n8Uo>#03fdujg*MLApSfP{IYHOQg8>r}pWSCA z!!0*5*uIXsAz~*ojbes(Cab5bE}(_3Vgc0-b_vng9qaXN=$j)*{B9Z63nVpNt5?$x z>EKp}fN4DKLzw}YRtbTmi)4F%b@l#7M@Ht(t9B)H@!Fh3(&{o%saA8vb{ePlPx0f9 z$uj{-!#*iuJt;)U(#A?(E73}8eqk?jJ;19RvC$;n@h4Ql`FTruDKg!eI)5vNSU4=0 zRJhzws;kIYQxn=JC6m+v3m@6Aps_F1ol_^AGb2I{W=@$Fy)}u!h&+KBhgQrc_TI7=JZp|O1_vAsscV}|o1 zy@uqkWKsB{HXs=iOjZl3+GuA;A=MNi(`>DP;0d5WVM8_lyiAdd^y<6-)FwO?t>ATa z{(WIYCmvs&o3pZ3>lq5};UoC`6UjNz9`tl|{y|uh;Rx;2H6q1x z5xShyOXm6;aOamA8_SOArc<2hpEr?Z9IL!xn^a&c<`6GY?@^gl&wpWBk&-~aggsoL3Z4I?K& zi0a?^Hlv=oGnP3X1d=dwOudtc`HuHvSU2(0i{#Va70pk&odtm-V1XssJ{-22zX1`# z01RbCMDSfxkYJjVf;q5XAI(R0R84%I5FnaXjq949wC{xLvT`6R;V>I)=CP}?&hNal zN2OZ!4UN+S8Q()tO|{I{MQnFq9+7 zcG==ddn*-ZYDjrHjis8-Sd*%uUMq_0kuHnvR8vbiOpr-f7fpf>QgjvcfiYKD`##^O zZyF`fD9^=6Lp?#=!;te@_eDQ`VN}+Q@CDVLMvc()?L3Fw^^4R4IzFcX>&%2=FL}?# zFj4O!`gGf3n4%^Gs%U$ zf0=|dvLX62Yr)~6V11+D3$$|!yInW$;PcvT&CLlt^12K}6y-8j0J(MTEUf;?)c3VB zL3IUuNM%Eoe8l`lYw|@#@rbUDz`L;NcL(lO*pC|hmqiO&z-4^HApZv6l@xS_mmyd)02do5lZJ)uIHe)jx@S)owhYt5`E^RS~asc8ru zr`hbkVK~v&5@Z__Qz_D(+5V8Oe+aT)*9J5Z@<{E#>|s0eEKF9g53?q9fBccrLdn1{ z#$0riO~M27Eyy|t#h%5+5@=U)TFTAZQ7U?O6Q>?Z%2=^<1QD;g=ar$4kQv&aeF}Qh z@^BjIM(2Oo%)=Y|F9b|In{38b7DCj_fY^S8xt`K4SUs-zwjPkx3&8X;fbs?*HfJD}S`lIFF`aeYCtyx>M>nkT zdyv7W7e$3`@5IUH!Xy#aPNI%fkoM+mMG{t3x>A3SyC{@5RTJ4rD`wfEW|K0=d@w-} z0R1vBH)Dl|`wA+GVjU&Nth|5bUM6IhOz0cV*=>>6UG{6)o(D{uM;|{35Yw8Dp3DI> zs_>_Gg3X&kzqy))?FDol3w;U4yJbZ`8e9C^?AaEMDp6wcUZ%O2ur!Q;VF?*g(Zzfce-6{AdrJ=u)%X9~dqXBk6t#oIsO72sk5Nr8h zrtNU;US*;^j{R|XSl;hKzrK}nUh7^2LQq=sC{QWqXh9-%_6TzC!DKElcj%jT6aRqN z2E|pNH?O4+%EwG>`EWFn0MJZ8(!xngd&OP9&E|2bghOWPo8jn@so4Cx+{vjnP+tGO zimr}q06gL6A3J9c`D+*h&vr8*{O90Jzu&H9az!URaC+8sgIRw|Gd}wtqoQ1Tr%<{u zAnar*m6%@}YsrfK@S9?|T3}ndcLS4SaBuswY}1-#{sbS-1VzpOb`urnc*!RRl)-lX zeOvVo+kJ@_>dunqQ3&6+kotM65#Jo;>ADu_x|tW+pzu|T!+*|0jD({lE?PEOgCmr+ z-Qg0uc)WshNIi0|&_-4eR9*I{?Q~}$T>avDGJMWIQkw6QIMl_!v43nS`HI4GE?gF! z%m3TG!c7Ox`|uvTZhzuU1zq>N1IA@~vsDAt;JG|H%urN?I<^-X2#i%8|I8D z4=bB7YQ1}dL7(4ddE^u8(Lv~gSK_st zdgo}uYQ}Mj*VDHbyr2lTPhlk%!imBFeU|!5kFMDSN$TFRlR}uCS6=Akyq8UxeU<_8 zdoIzYEsQ?KWpjJp;9rK!$HI|e`8M!v)z35tg#2f2ghq@V>)*#LqzwRGamfA^!G!fAXeV z7sTxgHtWg|Yz>Rnu>4&ar}%{r0wxQ_>9AgRvLs`KG*oUrUZyeXct;@lYx={74B?F$ z!c6J8jG(0Da=B|YHj{5=bXsSSqqhUadfqRq?=JmDJuByM^a+gX9xd_PFz>_!^y!Qh zj>wEZsGQ)kk@(CrY|JZkH{_((%J3Co^r-*!TOC?X$_zZG&qu9gYQjz*K(WY&9M4vo zTKbO$?#0^{v3mO=K^;vHzBJp&SjO*~R|+0ZEd2HJl9!(47Z&a&Mdw$-;&G;SRqx`Gd|&iTP91XWax zPKxU{_;0Ef*th>txaJ3>x?KJ|yWBBglrgX%)FK+^hxC;^7wehdDT)QZBTEK*^>ZQL z#zvKsD=kr6h*}s%fwGcBKS(##AGC3R=$g5xl+x5GE0Oo@cl&BXD@LDE$1A0JrrNp6r9jGmdx-s^1&{7#Y5q5+i zKgVdMaaG?{l)C$bh!2S%Cev94We-RtgKN`>rlS39sY}{7N+V4WzxSc!4a>fZ7KY0I zm+vzff=1&=4!`wVeBE&LQQ8_E_mj)7eK6!o3n7${7B~D+hG-s zEz1}7`HV;hMoA(`pVVF8Hm<>|6^Kz1a007x&CacgUv8P%2_i1l-Q2Im;&#F^ICF%4SBGUM2?SGN72T#r}0+T9b5_O40>8qxm!i^H}~ZX!L=GzIwCdUaFI zi@3v3c9gw#hW6-}v+&7*$)MnM`gsLzM5c)YPO^Bq$?x6YE^gX{5a#%c9_*Sf;fAH< z94u|nkNO^CUE=jC)NAw%t-9gXU+8}sk$8eKN!r_mxe9oz>#70ZjkQk;f8s&DVf(Do zrgBW@dccd>FOy&1hO}lx1Ao4@IUVA+a+PjZ=RACL;;#vk*k_Z6b?FT}goY??hu&YR z;;C48kNFNY@Wif1Xo`lLq90ws`@3YD*eh3G@?6g&TpadhJizw$DM|I>O8|9cYn@Mg?3J?K!$rko;4x-1XRp-Z~el8yOdyh(RR8#;2~kDTLeNk^f z4mBz0Ezc$9b;GUIDKj(!ga0dPH%%0Wk;DbU#bX4T@O8zBc4sf}T?uYH4;Z88opf;f$T_BUR!Y8A?a;SD&Ak!R`Zw4SWp2gZZIK;;>gu{buvI9@+p`0 z0Vc2Xnn|ZGyaK#$S9W)eu)OJ>yoW-aqSx}5<-8?yw8&OjE ze6U$H*176oe-!W}l`(w6#JkEMKV!3>Q*mXY2cuY&#~^8Tew;V{C%*J|Y7R{BA9K<)QX8GNX^Tx!)6a^2quspi zmI2SX>du*scO-M)g3t8RFZBhkX{9+jVj1Vip+MqR)jski>zJ1d>I`4`DdV5Q zSRUP!@|5x)Bf=Z?rDB{Wy=PeGOrLP6pqDJWrn@2}VvQjS+zI2evydM&4sM7r2Y6-3 zxYf>QEl(FD4ls~{kfp03tLxDfr{Z%oHrVJ+@_ItMmjELas|2G&bM&`qvPR9Pi71AK zmQ|iaztGLvR2$*O6xmQ6d5)A)ivNRMHk0QCpSIP7lDWi4ZtHBaixxA-Qb@+_E@&17 zv(SR5iCo@dL*&Ujq%ngiK)jl1LL&g384dNk;?^^5_j4v3?`?HEg1I%J^PV&2K+f=Z z2~{{(0Ve_}!}@q~JMMss<-!OBHE%z-_VJ)9biN`<)4AGrVLcD!eb!JZY_pKsdsJy3 zebzyw*SMXiWBFGGAvVT=TocjWf4$C3R{9}od$luEN=`a$ZV3n#^_nX2A~==Sv_3ec zcxL&<|ILgX)yjb@xNPLv#An)Fn1tQ7%M_+IIMwV5cP(IEAwnSWh_QAp?z3}@Wl~xj z0hB4BMGFuJy!2p@Nw(carLUwX*mNWvc1963{q+R>tBbuEspy&pg17eZpVk3s&W?J; zNuMhnd!+NqK(%D(FSpot4CmgCV)QN02r{9B0^j^dyPT35Zf%uzY|HTu?dB*b$TfC3 zA;Rx(f}$HGG_%AjQ#hTgwIKyYE&MY#J|HDa#^3GV%bX{F37KE}0p;zTc6D!D6TYfe zyABR8Cy;l~r2ZuvJxsMT@Z;szEliPo^5S*XWz>R!wVRP_L4#$uC=rO3?B+1JUXXf& ziHia7?Zb4|6-YCDjej4`<#Y8u-w#?aUrZ^Oc`&Mjzai}w;Cl(mii+R)7qcrPmJ>qB zidAzqoR*ymq5c-SgV)Y&&U7wELdU zs~6tv7?*$CZ(WBjq8+6E98MnXo26tV4o11;k)cjSu`M9XvTk3az*ya-PVeX^x)o=L4O_y&)+A`HU&E#c)P(jd0d8Z%U=B=Nt;{yGv2n{`7vks)wJa^ zKXv~0MIan}d^=bfI0_gl`asraMw`uQIg*&YsCKWMM2 zYnR1#Z-gD&{O>0`M=5+>#kxmhn`e)_M1TSrTr zelYI$r`8dEl77Mi!S(dxgkSIKcYoR*qi(t2X15A`^I}p;4>#IZUfVskcKGNOFW!I8 zsVPv*X*4hY>fuAPjvQ*568G)x{*uqF-v9l$%an3svg~vbE$d`{-B_--Pr~!-1Ge{n z8MCc@$i@EGrOyh+zdRrGG9t?BY=_Yc>rQ=DDmOB9XY+#rI-A}7JZ`2`?CjTNdi4gn zsW)2ZpS+`-)M2QzUC#L58zSc)9Dcb;-O}}rc3$2iCUtqhwQEaNN_Ez!gYFL6j|b|7 zPZ~FFY2UWXnk9ca-DZ=f>6j5KR&)}7*63>UJ*VO?UHvnoPP7`_Vak}Cy88WZj+QGK zt+-Un`{AW^7tVCfZzNR@?&*?Nzs1SM2bN8J{^dwkg$M6~%I>|Y>OE%2V8ga<<@#jT z$T=Pp`^#?gwafGOJFi!zN^C#%N!jx)p`VZa$3fp}pLCo(^Zd>1^nJhfR@qyB=}P}s zQ9-rN4}GG3fBO6T^uMiy)k?gu|FCg!+MxX#hrG%j6SCV{dGwR6-PpeR*5}67nK1oi z?~qm{U#vJRP-=6}Y`lE=taxUNthbNbX>$F;b~qe5bSL@P#iRYb6LRI{&n=wYJ0d76 z+4-hZ?dC2w!}5KaKb|S7w)*3L(qKv7fio-Zi%ETc>urnL937o$5}Le2Uu8XHH`7tc|A^EIseznykyrn>}ddsvSQ+p13q~$E}|aVzv&bu3kT2 z?a!90Q(j)#`|11Iejd(y(i;tn+O{$2?xJ4jCm!-zFIw%Hu-)@&x0QZ>eb#m{yvn)w zwf(NOb)Pi2733lD$r@7XplzcW0jJkA=)JN;hhwY4YfsvBY5J9A&66jVDjS)%X5XQA zxqUBho@A^#$Pkok9A0;lFzx!Woys#O=5-IcHaB)=&(7!U+FK7ws}7JU};BDI-cLmw6TMWNbC8LJNsZ~}1*IZjAKV2q&AxfX1T8fn+u_0r9?%@1nlzyIt0uHUVn zoT_ItrG0+?7olfz-!7^XZnY)8d_wBvi10z5staGwe-(XM>nV%a8n^h!1-l@>Iv(%Z zKk2z#V-q}f@VLj{_6awe`d0guxpDPbecrR$A=j&ftQzHikf|Jd!Nvx3N6>|5uuCaABd3?gS)_XJC zMgMw{I?aB6i!5#4nf*)TF4}2-&6Lave`s3vWyttTzw{*>bzV>0&h0O#H99h?;aV55 zZ?u1#dEKVHdhoVv|5Tl^-T}&>CX{s)lKv_Is82^K|_z?`tJ?h7MU#FleyUG*D{gQ2UO+VZ2T5gK>T-?@k`8 zpim8LGA6P5_&RrPMaP^LuM6luba(yK4cae*2AgVBdAEJnge_ma4ycaRJNCVAncOCI z!sQ)*+N?Mge(l(lFY9-7oblIR%|}P}*jX_vS<|9JT8W%f6&K8l7u!6tZk}1Wx9_QO zb$oBm9N+hK_5lA&y6KB&jmnyte?|XpVV{|!jQzA5Dh3Xl{^6Lg{hD4o49%NY=zZzn zxyqVagC=kKu^XvNr~TI5>UE{=k98t%MR-?#*SlRdPSkh%`aSCX{6U|-$JVNvHEC3j z^LBTGUbzV5Rb=yC8lDe0zAk7{=aiP~RVrE5n3ATRy|4DLPmt8(e&c-*t+ILBR&2Af(MUCw-LlyaP&~Dj_S@HeW)N9*ksLm!& zp5LZH=T_x+UQsRIID2@|qhB+%Eg#h0`gU7*-H&^2WCw{P(h2Qb-B{Tzue!42aHIRT z?4G4vyf?I&I(|xK{hb46y60SSX(X7Gxhu56?NmQ$@A)mpRD1LIY2}e~4t$?~|EpHX z#gE#rnA&E@nHteMD`i=&Z28wB-TLmIE8l3cw}+x~%F5=^O%7QFcir_Nz*q5fkyEw2 z23ei+M|`xJ6tk>DrqFx%>gK^+wv6uCZ$OgzK!dcktyAvSP+6g2jE<}mRVO5(PVZx* zR<$X4F>=|mb?+5PjsbOk##Q)#Yh9_W?ydfw(LJq2xkWz5BEOf53XE;IY-8r{hO_rQ zzEr(_+EDG=pKlvZn-8v6b^567U0dZg^X?rz?B|$w$FCgzad>cJ@%<^!g7$WKSs~M- z*3ge-Uf&$_BS|tmFKzJds6@wY+ke?^`&BK$)cn`n-WfA@JsmPLZQkpD+TImoTJ4)* zmsu}u*{L#pa;)YFPT0(U-lpWKOvU@LC1%(;oH@D5Z{)qHy+Y!v9}6QNlnf4WioIne=IA==a!93mR`yZ#gp0eTP z-hwUdN~ZXHNq(&CmwWzyWYwc%K2LbIYs$WxhfCWuX#Qn)6YmOH180AmKU~zzXa1_e zTUVsp4a)6u(RszULk^eS(*hIkbc}Fzt~X|P+j4{ck~}`Fef0B9{|BS@_Nb7hiJeou z#ddY%UWWr?`s!a-ir%VsXwRI}zc^Ff z=*7oI7i0#6ZXQnVTT*&<|9$QQ?p7e5H;n!e7Wb>^TBo;Nu&2C2R<+^ADeN=L)U5xk1=};_EqsvU4ge50hT0Gzs0G-!QxV6_-k`oqIGz<9)GXnEZW(vvmdX9HqFIkMn_t+Imy(NUuA}|v3zLTobQxX4wwzbhyLWT{QTmR=P z`>#XMgEGlAv%kJi{`7lC=Ho5H{@R*W0{saL=-z3gU)+ci|G)mDlB+bj^i+jTF49W0 za-G;9Py1iL!vXzqb8#u*;O5}y?&^sDc5raS*BzW(oSmFpOE|hZIlH5~++AHuI5;}F zyE>N;IQ*}ZCDIaqzj)*SQ-4|sI12C-_zHT;)iRAv)Lm{g=p;%(FLYVZS))@)41xrW zPT-p;R~rN&_$z`?L@yG9LZjAORceL)6+}vOiE@J=MXolYhebsMbPtRc_(u8*oE)6o z#Dd5qxj-sWYt#xUdbHkAKT_6#lJEig@ zjZ!Ap;nB%7Ml=dhyi%c-p^2s_R+VC88mUo*c0j6>==FUa9km9bQf@HFb@-)1 zL#jrqQ5se1ei;&-K_OMjP4G2%y@EG8G!yijMrV+Jz;D5lNO`nCE0HEk647M7$cq7n&z*eD_DvdIQI#D3eMJrO!dg|r6 z6tot4g-kApH!74evKWY-(4;Yy@ODmMD;Fn&Sjf)T=l@FUQB zGzkfR3aJ9o6cCRfUW3M~!>f;W9McEd9e9tyfJR4F60HH9a$gmqT7}x%LG13TKr5Fh z*Qn$MUAoEqu1Lpz83`J-0quIBPmG2HkA4{nwboel!wi)|s?!+KwemvO6Lk_TqVKdq zmnAAaI%-Km^tV1;6<_Gnc#S3*ZJNH&Wpv4ZsFdi6JWHpO6q-eb673jTgThZpLIc$4 zTwzn_*Q+Aixhs zRG+N(Ht39UAzXuB@pbQbrBUA8)uDMjqKRbunG`*#xX;jlEPP~DiM&{;H=x(zm&Qwf z^a?5FM&2<7LxM!5P^QNuXfy`32AyBUATo@2bb6A}SmeB+k;A6!jci0$EfA0==iE6YFP&F%cj1Flw**bH{kWj zKwQ<7(HCFPOEcg;0lm>v(9*G=i7c2wVNfD+{vQYnAPB+>@$yF|!HNTaPm-twAx5L4T#KFoZw!}z>*W%i zG)b-_pT(dvrBr5wBZ;9`7|>um1u=*^G8pcjh**j-9-d~;y~3WGDy#quT821E23d`G zIbsmUL)S;=%}KFk;3PAEkxv*ga%SIx@5gTBocuHb`T1J5hIt_qt)sX z7AX|?YZB2W2nBuQTKg`TR~Qt3Lb{fr5%{M_xmu4_8J-}QAW5lDQeeTS&i#ibhJ9M>-bIIxLXY8uTm)2wRvvY$e)JPXX|P zbR>Tb@j@2A5G&)4P=z9i#jipyH!&OR*YP4zSCP|7$Ap>55m@}*#mT+j6Mzu~3LQEz^ zLsy`k*6K6^8<{RiOqA$SCCYZ~>?JC#NhpvaUIsJk zB$vXNUG2nz2)UdcEh1~ZeOP#4Xt=0XXn2rVB{LDVOOCZJa)wxcwgiifB(V<0E=CWR z2)adtb{9pU^QV%);~hkfPJBwj-%J4gfszJGka{!|ItHB_eTeuXdLVZRsf|kB1@s)G zZt^auBwRC`FED#p5v?bI~TE&(I9)ywI?*rV@|dk%SbYWUT9d36Pm4Lenw`>;|PG&-#jy~f3fi~+Pc$ESj zU_>=!M?1O-yakS8WDCMefuztA;SnNqEa06Av{m>G=sR+~L7;VYK;Lk77kk7AReHR> z=*q9AnKG>ioyQd8|i%P?hze zsT=Xk@gRW*!sik->?L>H!;FY^`oXV5u&S7$g$wv|6R47iv+&g!bVW}nJtGj&hDK(8 zlrp+L<_{U@Q%?naLT@(4GxtYg(_Dj8WtArytrG1qD71w&BMXlb(XZi05`nBUBKEC< zqXG+!ltRQ8(Rrg!qvsSIB|VldNT)%xi>Ov0MJs|R7im4AJTA-A%ZM>6=kra0Eu12` z4v`bl((L|OO@pJ!scPt_&jCf(E&e()VxVH3Ob@~}UM>TFe*x@k ziULd>o^mM^7$j*LwMLaLumyhsq934e(0%B2JN{F#Kqu=B5>kO^7+H=9a%nnRMtmcA zFVTGz*pnec!$*20=q;GdC849N)1cLoE07Swd`>Mwj4uVY2yuvbokEs~3?HBga_aQV zY>=`B3O zU;_1vD6x17UX(8BP{8C-pwrGQNs%{VLLje%$s;kS0V%@`+8{~P)8R@8Gt#ILwWCvy zjyDnqGGxFQkW_(pBCFhsl0Q-%fT?382oxMvk3=_;*F{AIcA{sLoIwMBLnT1WNKr~m z!X%_MB4Hur1}sD0^$iO|>Wd^9Bno)e=sq%A2iuJfIhfwW#z0yZJ_FbVsL;y6X7>_s zx)8Hm*!!jDRteS-JH(=b13QT@*#d8cW9h|eO6;OB`_7CWGz~4#9o`v{6rDXeIu1R8 zk<9~&uo$TrBIXQY9~t_80zQ~z&}ts{!A1dEBO+$N0YiLP1C0v2&y3MUtt~hmXgjeG z5rNE5BAr|hgCsfz7Al1p95R%oNW3BI47*Pa;48xt4Q@7IH!k8mc&AlZ3}Q_PyUrpR z)5H9@sN@p0o($LAh9t6!(|1kG))!$WlnuZPv1tcePn8?+l)|rnUT`LX`NaJR$H<_L`pA16I)4(ql{fvF3?cZU>35n~SukbX+laiIXaYS97E z3gR_LqUy2YDk29+#+r-r;#65X%<@u^f=z@3Vm}%gGe7>^=y_rFSiJ^&+oehcv!4cu zk}`*M#@rKs;$OHemr8Wtq%r6V=|GI4#F(S$^xWVLl4ETf1_7TDeOo3*D;hyLKh~j% za>?vkh<_NP$Z#4enwk>4lHdjaZb-c#_%kvdlen-x=+84QENXqyLN`zf!XXb342TG^ z0c>`kC(jKB?q+l%O?{Q}1OxTS6+#dD0HnMV(GUwC#5y{eIPVAc!05GdseOtAxL@oD58}OD!ZRNKm%b7&A_1^_ zg#QlaWbnU1T_(IsobQBxALB$Zky(&glgE>=9%I8Hoevq(dI(J+tyPT<8#rXBu7Y(s zFy)AUtBEmaB*ZfhY9u&P5|PkHM^Bp0N@lczu3`(D?SwbGSjP(D9AW8(B=nQB*wL{q z&(XrMV$uJN&jn2ku>|(5SSJvWxPWCR6JvprRpbqvm<%8`85J9Qo(Mlq0I|#`9KsL4 zX+aesG*hhvjyMwYSdlPN1qa3lkuxRYCP)W=F3w3}Yn|-v=3s3{30n#$N1E*9;LuK| zOE9tKIP3pHdnW>JO86?~sc2c0Mwoy>qeLSGa|HsJ;Ibi(2&#n;g@#=wq`8=w zwKhME$TTA^?F6MHF;UKa%xEPsu~Z8L6`m+=a9g}QNrBZQ=KipN?wta=cZrGh4GRko z?dcmF6Wb{uI3O~h6S@>B@D_+1ks5|)MmHS|6bxsDIz>TrX`c6*G7|xa5G7W|!2OOL zOQ1XH1=zX*&li#M?9szf_CR{-L1n~$N(WLd5?N;l*+{CMf^nxa!Z`z-7EvE>KVXn5 zBR!l*$wd~2rG0dPedPIm82<-xtf{m*1$KPdO6-PMa(OyBI3SG+b`=MxK)6X@TGlaG zdRhxy9XJOl_d^&2FdI;cb|!j68E7Ysd%qC!;YvA9-BeHkFYD;TuAe` zk@8A$Oa@|nLX{*<$gFmZNeuEH9eNxwVF-w$Kk7^;pPOv}R@?BzL7&z?>{XmpM#HmeuoxhNG*%K?|=re3A`x6NxkOQfS zEsGtplAxZ6K$+p3Nz6kcjY^0?Fs2vz&9R-k6RXzX0}_GRExk*Re{pQr&PgUmD-6;k z1#~D*?ZG~6(11CWC>^tZ0R>qWa_TJF31FRqi&}4PLLrk)j&TmGc~jUMPaM|@)~SWo zTrHF6WQswQm|;O-IbmPXU<`7zl~xOagG0<7>ItuuY4FGBe(vRl_XJ1$en2F8WV${Kqu25ooGyu@NJOQB9^=BO?E`L1+a#|6`6YI z0J3Zykqv~m^dxj`Bn#;m;2T1;R3`?Bgqbs%Iofv}@gMPCnqUMc87S+%Y8f?`2r=u4 zr9FslG|;{$-|kI+aR5aN&{Aagb-*@=%Ms!|7@kQj670M;D5&AiS91A70oy@DHD!nw z(76W&M0OSgVn3bSAnF7GZsMZ$4-@t3f&>r}TzWD@LlV{uxku7qG})6Plg8@=9zeB$ z5FF7BV7-c1d|~+P>kuDNNwk(23HK5Du;>8rPUy}222}EYkT^N^JSZ6dT9L?tkjgt^ zd$3{+Z6#JZr2vNjAHRPX6_T)Wh5R>I#)t*x3yxGO^nXQyg6^UjdV*8Ig^Z<$y+eP} z^o5Kj&sbl2Za|g-$lP#1o|)Kavi^_KPQU^8@cFP5Ocqi^CBx?!Bnx79oF@WqL9ER> z2JCE1!V;Z-PLpa4td6G(S)2o?iRQ=GL>UMfyd{N>{|%xA=uM1b$=3?__o<{>SQi7b z7MN90l5N5084YZ^*b;f05k2CTXvyHDm>>d!br*6cAwFh;@km4=P6%g%c(BE0p))_U za*1e*)x`4>P6%Ak3q8X8STLkt_#{zcR1hAH>7DU^kibUj(2+=$q+kUO-5_Ed&a7xL zP#_57E5cD9g-kAzCnWHYCTO}?%fZxww0FWx)DRX0mH|$G;_)9Ha3(mF@9PYtWbcxHdtH1%nhAItk#jB8xx)cqSGNM;Ecwes5Ous z0x70{P#Xy;6V3=mIHMvYB`K1T^Z>{UTsHlO@jIaaV2nB}qgBkxqv=w(kAgS=lE8a` zU8k_dXedHH9_f#O6FV|d#@WFOVDTX`oYo-6-X_Flz}J8bNITX+&)Z|{+Jn#<1yqx9 z60{T&$`U|0is|ColYkNz8A?Joytp`jDQqX1x{ZyXExJ-D=!CBF6mfPUY%mLb zKPHyk8WW4GTEsU@$OK^RT>3Qb9>mt=I<&jsS=8fUI&j0rnwCzamuj@ErN+1$*k}|c ze7#-)u~2mKWkxN*KZu#=6|5)rbHap^)tXeKnkUMsdx9S*Lp%&010@q3L*hmyAt6nF zj6TtU0*u(F*o>aQtF6Z{a}8*S@Nnuql#rK*S%PCB2{@vPo%z@d35{R^Qv9&5SK-hy z5#Tr~rJyUJLKcYv(Vm)^YZ@)Xgt}`;`~l5FZ$>XT2B%LVVHln(ltk}nSc>!TOJo|Y zfx(G@KUj}7d^mv`&Z$kJzzTeB9BlM|IG6=@vY|yG+AtD3LB}12NrG}1xhZF%Z%7Uy z6_t4igohYE0>uiV3BkOSig-k}=|V>RB4U}u=CB^Epx$!gF+^+{nc9FWRLUg~eJJ9i zwx}?8Vkfvn&!!Nttk*Jhgi&Fo+E^G7_xQ^CxZZ9@nHsZKh2rIJW!>D?bS;ldJjw!d!;lQgWg__ znFzOe5~5v0WGo)G4U-_D7hg4h@O>??RRDJQ1`3hprb)y|iY~~+RVxH?sYaiUn1Kp$ zf2GDKOF-(LoV-p2aS?{(==98WB|;jo)H02nX!isH!8u=fT)>y_jD#=?S;$l!a6SU6 zghycnFYp-HiXxsv9(!aQarT9siG(46^9L_2p@RfPf&nd$2+bNPk!HYuU3eoLBoaSG zqk%Uo^f+#u&ev7J6KO!)g9ti}R)UT#vwcjUfU~VRw27KjJ@0U!v(rl+FYrUe?hD>oE$}9=`Wc2MH>wqXSQ&FmmB+_x4B$L1 z8tAheKCr0hiok`#FjKRj2A~q;2@)jLiugHU---)Sgok&wGjkrn;g{%=>B09iBE1I^ z28wegLD(DseHgET))(ASXguhgU`!RTdc>fma$-&^)G|eiLS~dGiN_X66&==R(IH6E zAo+}j6d4}ik4}z%KAFl+cn-2W(In7<^u@kU$OO`gri^5yjOk((=q6atepZ!8q{KSHnw5}ptj@!D&?LZ{h>ox|`3`#%ddm&Q!Fk@gLh&a?{ zvh2e{3l0i@D|ou8V>$t6_TZ6l8jcEX#6lM7ym&{J4hSo{L?OP#Ob`!qEr3W_UyJOz3fANSLlqk|c#>SAedsQBd!$8Rx~mIG&%p zC}-%3@ia^rok|mY{yCaK2frwQAC~if8lfio1zL4~86pKW;TW*`NtQ+k)083`0uSkg<47=fB(WEEkH~(UZca7J&`=@ zXXvqN#Hx4~7z;0*vk-aiY&v5sn(+ZG^lh|>uoHxZSy)c2A1GK@tBgDZ3nCFtVnvIY zXa=c&jyLKQ1U$uJ4dap811@z5c1qw=rPphu3LX@Km(v89J9NP~Cm;(R7uaIUSCarr z4LGS1(Tl-TVbo&S25T!2EyoTsJZ1m{T!igPJPfS30S<`z&Qvfxb_e%|>PWWC{v$L>mZp6(%wykW(0cr!+~Ukm7hZ&Z46ldoetJ zijVnYg7PFrov50Ob)ofy`M%U24t_ zqM)4)OKe3{4K*DH{6U~;hC7gqSE>U<+VJnXR z1&Y4n1P-I*vP8z1)V7$R6n+*17y(j5y1x^~C*xcI9i5vV68ws|%Q=rBpY%AIAhAOY zgwnBU!bEOq5&_&GPsI%0pf4PFEcQs6g}#^!0uH>whYFJv0)n4o5)O+T3>D&k+mPgn zgP$~ylnZu51v0Ly^ul2cbbjDe81xi(CIM1ZrbGOWg;Xk)maKAH>K=Oo;L*nex~H2qQGeM6_H=5Ib;MvGAoXcYYKGKwAbQmTato2H>Yu^JoHR zE8&IZWn-J$SU6Nwn7wr()@h=DMxxXgy!k!y&qmi&n0*~_$&IlwySWi4qfJB$>#Xm|I zt4@orh|rnW^MH2RbQv)s7{~)LGZi`=Wj+jeRi1{473EE0s@PFs!nvNurtH#9)(7nh)o*mE9dwGnvpst7O4bsyfb?5NF*Xm1ZGas z#)WW1@p|LfDU*oHD)$n-R3by`9|2?G6A|$$>&TEXMS-~$4+4@ou-qUM6;Rd%zgLRg z-Mq{YFl1<0mMzu65~AVNX52b((8 z3%fs560Dq%pgsK>c!{_dMbA24>=2V0 zJsEg5*2?gI@iTv90$NtAe%T^9DZys6bzcXeV?S#ltC%9b&-)VLctz3)^dxQ3HcG8X z6Uen1L;))P@Gaq*ZR0h7d||!3P&o%lJ@bVDJ(Lu@LBk{3KaN>ZUpqaS;A_V}@?9Eq zQ>dqn2Vn8CxCA(a#kniY#b!~3K_FLPUj`v>?m+^7m>-%cD3xF?>XY@vZK;+QLq%An zFyYKM3O7(dUev!MA6%-zB2^@#6?PPf9331SxJ7ogGp9T~Y`sE>p+|7c4ZP2j;6Mv( z9Yi8$?g4ySNT9$Nu9k-`!DP>`bin??;A2hPllWiaKNOFKZ+9W;f(k#eV9>|JB0-`z ziHnSXL7}J7dvhla!PimCpE!l}Oz{Z~&6TqOnFU#I1khk>Za@`rYT8-cMydgtNV=;0 z-)|%VAVVli0*)2J2ACTaGPDC4UE#&SzAX}SV&M3cQBpUQni3}nV6}$eCPau4>P2LD zSb7tlZfA*hl8{n~mKxt%%t7TV#S(x#iv^uk=nZ;Jf`L`+(fN`tY5mz=29CZ2bVRk8o|@nHoY?;7_Mi|2|UYZKEsrp=x> zq(Q~Ra*yPNZ9dCI~VzoT*TplZ<5VaylC^ei7kwiXhHX1WN!aC=gqf<$5-} z>~9LONmbx10G(y_MlBo@>u2HHIDg(HON&pwhnC*AdncYYkL#zIafm_!){@kViN$3i zd7r5@AfJFA10IP!3B$DsJ=mGKa)=L*$Nne}V3{5PImx*TGJkNGTiRIqO|+lHeBz`G zh!?#^g;VKi2q`X(9vUdV!^95sHa5U0&}Znph;VpM3ZG-&v=DuWeV$y(A_0qGFNm2t z3<+CCzo)YnbczV3$-j66yh>ulpcIKcvS@jDIRA^;di#Jt2&d>Bl94gJs+DUJl9GX+1B%7z(*#*1HKHgt-D z!}_9to^mm_1l(I;!N7aLe>JJ;m=Qy&45lh%h9pylG8*nRXtX*bl$vACRV3DmTC5@f1K z)J6lMGy3?#p*Q@{Fc4xSX^Ym^LCTsv#&L6x4^`s=Y9a?$k&}afyvzW^3VI!IEy#pN zLIbK}pdB|t(g8A?lpxCszn&N7L$B|uNfn`?+82|!%?u%exPzfSm70i~xHu@e2@xxc zZ{Y>H(0^NeErzEGFCQ;GSe>Sj8`6o_ox)pyXOnkvD;lpcAj6pM86@lQ>wVJSX{A>` z#>=6SP+uWQ#$ugoIKabX-4R}2sID2&uL;fJz!;Xt@r0s@-OEP>vf_cDC?Q#dsX53< zL|hsQ-$#{vE;eQUQXC2dj|~)E(dvtst(*tWI)8=-FE8ST0~8bZPLxGi(Lb90B(xyW zGL;e7V5eo{mT`BGl0-cJGJqoaYymA`k#y2O55$(FAA4~)2?C;|n0Qi_1|o7A0l{Q4 zE)u;RKlxp$H_)Q5roPM_-sI7Utr4S!Hvn7a{qPWUb_J}{L%{mJ0hkKty@8%cP?Kxn zM1Rk;6Nr3x*N7SKDG-arMIQ!xMIR+#9tPLgM+wNo$Tj9s0!t4ga?<=^o$)pEhcVaw z_%N)KvCkq83xR9AXTihhHSSrK9!B&W^N|JMYvv+H8-pha}O}lV?ot-*2~Dm zs3hz`fUr92^TYL>ndil1v|t2J3!$I|BQM}*k~{!ECE&9lg{>Xn@e?!QY50xY)LVOUM2An&Xag9} zTh0=PkyB^Me^WgLpk=l!Y!3-C1~$R z;&1mOe*;~^Xl+QDIu=34LhKZYYDo9@A|L_?31edky#N!WIowXJ|L4=;>Eh@r61ljz zm@H+ohxkT|L5;CAIh7=hH#t2;Xi`9@zA#`jm6-#F(i96K%&~iuFZ(ePb2>PjIU`~# zE}=2@!pIb^C<&8t`z3!&8d~8EV)HOE;3WjB3Ddwa6g?!yp|wB;3XR1`lqBfN19r*{ zo`q4q2>_MlNC01h(*ak=%Hy<3TSr9Vgy0>-h~)9F^meoYF|hz6gD;tgifl*Vz>!JJ zh%tR9;6id>;gE4NttbkQ(hEl}3e5-PBM-G`tL4=@DgHEgIEjBmt`3f*lo9spX`n(d zPWMPiC)IBN)+AMceMge7@Q&GlwMVm^HMH~vV@ntI%2HU1h^dWQ$SWIWsi+K~5h%<3 zLnP0Z;5wHU**GyMye;N<2g5;?iK2nEir&LWYss~b)hXJt6Gi*$ffgm^QqYzhOz zsTmmH16doa%>{obPXo_stzgUrO1xNIlFO*DU?dcaF@orY0^{I_5Vjc9m0&0eTO5Qb zEyUF60Z|AwVZpS;*jWEGN+o;sqWwxaYd%r&}sb*F#t7x(f1Kud)tu^s67r1}g8Xq52G@#`PQ3M>ygJNX{ zX%ZoIs;7WePYT50h2^SY@>YNrj3; zNtkaC8)ttsi&qeIA^HRy!3M-|ihe39CZPG}kup{ZACpE4_mVG(6dY=i%ND^XQ;14w zv_M5r@`M7k2|kZWV5ilXB+67tx}K@ur$>a#M1k<=j0TNJ0;xR$Xlp=KaKH%a4Wy`r z6t^GHQ+14}z91-M>}P1T!K*(2i2^i95)RC+IK<6u>qcu>!=-wi3+2BhOig^*fC ziZ6d-4=H?DgegWqP>-wUK~U*vt^o7Wi_B|+08g>xtKyXdF;A_4<;Kg7J6?zdezc&T zfXV+PT8xsWKXDaDyhz;Kf;B<>dGWr( zK?LY`70W&)0Dn=qe{z|*)ph@OcQ^9p}Lj^!u<4cD#8egJ`GpTHhUUqO<&-za5s z{D>nG+j$o91lfnHq*^hBr=&RG$g*CcQXncFTvAYFei zHp)y&6G7K4#vJ7`0U1UZXqH`Ds1^*=Fkzh%#T746;;iE0u|6~^4u#1jyn-g?F*~Dz zxzDU5i5=s=;8%ha3VgN5B$SJs5T%1lU(M7&HN(FVE=31Tw6ZXr1~@-~D3gNW7=j{E z=mZf2G8jyrC$Q}t5scp69SV?RONW1aY|t10Z_AX$aCA+^Sbq#3ren1A5W6J*X+4Aj zr$Tq2*~3lf6Bn_Q`FEu{h1Q_AM>K{32{2rKcNf5F>RA^^*T@jAogO1cn2G_84!p7A zIpOd!Sq3%^09Xb4q6uQY5Hba10%+~9Lm={sQi}*et6U@z5MfL*JD_8e!1RA--4Mtq z^_1|QYXVK27TdKo16884%v5a#GGf|saUYum{=tFZ4bvN8er#a{S_KbyHy^G{m7Ss? z024&qkk~8Ml#pl@*zqQ$iU8Brg3$zs4#40;lwRy=21^K88l(0SmNJ$Qu0Aj+MAB}#;(U zF*VA({{V!IL6fR4<(LybwU5caKehBO%aR0y^(0t z0M0RRihqApNm@hk=k@>nGsXkH6p_8u8B9-yC6|!JvUHYI0PcSyrg$L0Y}m^j{726t z`$C0kX&qKxw2*`W80Rrp$Aow6_)$6FARG*Vhibqkf{}SO_XVaOhlC?<2COX>#Km>T zPG_jD#kASrnnqzcDI>lvK2({*a4_LuR^*X4n05H@LT{na7|XBW=Ah-7fs!J_#jRmz zGhciPZ8+}>*I<7}$P{rZ3QdQwwp|ezR+~TIu>1-$1iCv4DBcg%It}S&oQ$_={EQKE zU>2Xoip6HZ;2C6=Kq-h8D9Jw-L0Z1#iF}+^R5)!AV}{=HHw#m@wunpTu2Sqh?}{1t zo_lNvyTs-|Fy2w+J(a!aX>Sit`PaP?g*5Cf6eJLbxp{w-9zBYt&;Q{ETbz`D$BDhj z)^}uh46u*|vmx@4tMltr_{-{gjE!DrH}^G7aw@lVG3`C>2-m zCGC(vHnWBCC2D4`aN#$N#n=^A?TQr2rBc#@!jhmT4GoLhm4!-0u#%olofYZjkb8nn zNQ{5?m5cOd7*?L;$SP)*jZCIwB28#z$~6-AB~w=g>gORzXjXOyJd(Uf8b%$PY=k-i-dkGCab~wkbxG@N4H`(Cawd>%#8NE#_tm`E5KGx246L<+#Qc|UZF}1 z6O!cW7RVViJM@5ntVq1WfjD8B$ri(26or4DMwVnu%{N@=j<#Q9W>5$nDQ5CKyr}I= zOP4UE@|f5doMaiVDQKaf2H7HB;u=o<)EBq0OaU4+La9NN!X-+R%nwo<0X***5knJo z33ME>0X@I`MN9^*m?NYPNk~}$T@Fo5rl6VpMm6xr7?X**KuHLSc?1b&n$>(wFqnS_ zUbQ+fqUBt%09Qb$zbwLCikTi6BQaO>8f6NEn!)2NqFVy25Y~x!kJy>S#>7J7K%D`8 zVv;|h)F1X%rYa!CPmSX=;r;{t&@5A53*)V zG?Tc8fWN_(kuY04uCI>ck_n{Hu$tQ!F$p_=Vd=uG0;$%c!P1&ymT*gFtxk~wEP`7J zhVjU8)l#NO6B=H;CJiUh0e_T|xC}@}61nsg@JLC58}{gF5+=+HZ42H3Dhv!91Q70r z+blBAe_;t*V4-@0N~AOpHX6aXs)}Qy*aQHO0IjhKkx=5+;zL<%+0eF7z@*aJ!EsW5 z%QUH8MLXmvs5~YG@#IQ9Max_8x8XpoNb^U}8@BgJdp~TRLx_`s*9qJlVuX4c_W`zm z#S|Htkn!1}rDV}P8q#bV3CDCOv8p5)|uF^_+K4M$Rsz!y^SPo~fj4 zVUx||j2=gyyZHFU*Cb3sHm(X9Vm2Zwt%KGau833*2#CIeQT zoT>MVX&E9}BAE_DzuABmrd6JQ>#L}T%SK<=ABIVf*D*^k$8cVrPZ_&>FygC-hW4Lz z@#5Diz=?nqt0FP$3`XDWDM$y`Lc9bjom12wv|tD~^MNx3mTaYfNgb4KZoOV6bQs49u@2;hHfkl9-Nt=*t=cxP+27{CZS7?CIjF7b6}+ zTf6gnE@ONa+lETb6`tcNS-_Ar{7%gb&I_t=GI4Kw7kkv;Y!d&!-Uu-lC^~|P6{_Kv zI|%_Hf4d1u))a+KqsCjAooj?tdM&V<3R^NN^@Xj64I^32UMz@Xj40{;loy@}N%IPalMV?>h{f1y*aQW!+!)olGSDDA@ZdF&eE>o1Dv z>g(j{X5L~CZLCx-HgKA*lZz+`65b*sgVADArt=RwLFgaGXjDtMT?IgRyn@gwu6>Cs z|AD+_P=-w42QM|n)q=8()*JB>3giMrh(=@hC!VBI$dJ*2z9a|j(bZKXa&zNVXp0Jj z0vf27T?zqae@S7&e3>SBxO%2WkZ8mWhH(|#RCtdWq83B^HN?TdqBSin9d!X{6)74v zNJW|~n016=@W=`zQyDC>c|~juULdG7N^n_)<(rP)^3OmRuJRpyC@+iAw&)PIZbp=$QW#YjAOmWf zLdLY23Gt1lJ^4tr9VYjSV6XnUy=al~o4HK6HT$PFqId#qBQI#>Y=#-oa@E(&+d=~e z!zGA|41^^PmW1>i|HEvC>C}Lk6i~Mj=hy=!U=>D<;hO9|hrv1WgI|lhi|sI%@eBbj z4^XSu0w$Vm_s$>$9k^oHmo5zfAp+X`1S+{i4=_#eR?sr*No=ubit^{zMuYlo8XTq4r;-ZiYEZ>Uo(xm>mWpw)Ab|E! z<`rJD&~90mUk(8v3IoMW@-TK^Pn(*Ti4FlH0=9IQt_}eh0-)NL$PNK1QgagM1k7JQ zg1P1Tq}t2K%>Xnt(+e3eFnT~tEGHk~KH9??iz>Lra#R^`b5xO1#4VTcyhu9EM zs9CP1SEQk#gR|Vc#8)_Nuxt`^r!8NXLk|H=49<4Qt^r0*$~3Xf!i zTLMi%mo^XqFMoxMJ!Cp&*}VmLSs7=Wi&N1K_HaLed=Yh>6M#Y@hsY#pmozh>lg{vT z8CEGEbDohnjAIcZ2Cf|SV?Q{vyUd6Yv%tlgxnkVd1_3_DJ`SQY_?4a{e8Y?$deCr; zh2Ac(rMYrYxlGF=CM3VD9qnOR5ItElxqBpmM?o-hMSsPr5~&vyItF?=t*Q&EfKsE; zv5`um3*$D863n9s$M%q2{ z`icu_?{Mr`hHl=3_{_CLPPN9|52^PQy^c1>Oqg=nySTR-2^TYIi@0?lg~ym{Tv%nM z@>eIv342r!;1-=GO zu;8JA-oR9MCMDt#8S0QSEW%E`LRyAiDxnSK(Y|%<9?^?c=E>4J*n1#lm(>>waYLjO z)8mc=tCFOq@?vEKp+UOj;nJ+0g=p0l$w{Op(L`60iLVzJao=WWN|prNhpF=lod~c? zOn_uk z8rfvLjL}4`LFA%=hKvf69YF77q{0M^ME<#b{lD#AkNb0o@WXK@dy-IFYzOhC=KB z9A9Q*Swz^O_8o2p0h#0$XaADHj1gf5nr&^%&&I*MjlO z3OD=1Di>3|v8cY!mCa=gTD*t2Ol6_kkIWJS4YSBt-kSl+hqejqlz2JQ8O?0bxq;Xg z9tntB(8diKIw;aPlhm9v;EqvH080yYsSDP>=<*YdL9fJB^MG{l*}eGikR{~o<2)9#!$4bAAr+iJaY;T;3fP`rohKrpoZQeu#N<9h~*c{K@bfY ziEV?{L(fSiDgsy^u^Ngg;O-0zFcJ4cfLj%8ms>CLJ7pC7Zbzw1nZ#oH9O)(LKK%*05}`;lfL}?EG;>4|8e$|dN-qUUn%5zq zwg1^Kkc3>W#*{*hQNu*o(5h+Rwo<}1%k2e1q9P*E9vc+;gmmgQVV+NRjRl|6mqgG{ zP1uP|e<};un#YcLD`w9QmJ|qQtFS?)j6zLNcZic2wL;89@dh#>7`C?z1(#zJ4#%QY z5NTv8HV}7}1#}t6Z>*jrgWH!|HiB^A7o>zTa?mk}pJvaLwk3@Bz~MhKD~mmUAgy(ZGy)xFKBqOz*bc3r@#AL3ycNhW6|)AgwQxXedDG{nZD(QL zf9BR-A?8qAyju!?EXKUKuY(8X*D5OvumITL` zwo(H2PisCI{5QYA`wBlENuBhVSdzm=yZZgn1IOO)w)1!Kg6Ux`teKadadnoQxXV3QVmuQWXtb546I!*hxUzKVlCMf5zs+VoA)( zCH`ac8Ei^+=Sm^4O|Jz|m_)CI4udALMtB^wViI1U!dRu^^(7PQgky>uvu&3oe51+2 z+qsgE*h#9u*#cUT5?L*6O@VK z(?xh<7=CMG1C4`mg$}WWZN-X=h&D?|gtRNPn`U%h+@}6f+cF0>|C824zd{^5)E@*n zj_gUKF2fWE6yUpQ;RXT$WnM#iyoHfgwf}s)^$I2K!;063jX2|Ee*yxo;;K!6U(n2H zLJ;+gXNp+YI8vRU(HIhq>SDH?*>7{J8a%(uq{xiO3V9J%tHRt}gxDEzZsG^?4mS%t z;FAin@hxq;p0uU}7chyMBhwyjJa3D;pjBvblu3j*e;i@?Y~&anS8`~gq5?Z{S>?DGJO|L0$RHy(ERa{0h%jNYS9I#k zo~UqyfrCHrYQK55*C$CFeM}6_g*H7yynxifKx?XC8f=4amqHYI6(L9?JRJ9-97APC z)BGW>rqLG1HW>P0o!a1$W_to!+EkV*6goOkc6H6k3%l46e|afXTF8W9)lbr*z!F^v zAXO*@7jCf7YAO=5L2~{qiy@{V8W$2v26Pt^qO4=nvab;HMiK!L5L5!$!*o`1#v2n^ zoCW!sM#ucloPR1;Nk%7Bbd_k??*OzBpDu=$$U_LaE=7TZ7aaJM+a_8Yh}LP2C(Me? zHUT7a@hQp{f3xWfk~MfT!R5#gB33pE(C>eNrI~ysw`ll(UIOdP<1C2ounkW&azM~+6;*1>Y8^0 zQnS4!Xl}KHy3KK5K!F|O45|?if$?b*TF2f}E(LK&e+-hF@(i5YOHwq1n2&QgH9{`G z4#`xt2D?|e1cOwFW+ADh(K2<)xSU6@#vf#%m7ME z(lvF*;$pf~?*p71sKG*Xb}`Blwg)r`$ zqrxeQN+%b|vCyCmh7`mW7TAWv9c&l9aDNl8gyQ%klce;yigkeDpCp$f(1@Tm?*ED@&z8_cQ* z@N$LlvxL|YPgk6rPMTcK>@|9L@yYunlZ1DIaJxmQB10h(;yMM|)R^l6Y&Fy(aq zfAI0(j6^<@D%xsVNLxZnNwCo|Hp`u(WF@Y2$pF8QP=IP`AnvHF8Ay^Hu{8=Qtvaw6 zxriBicudriA`REL!UhyeDr4#pLT&|v=S3DrB9f~r+*qqn=>&Sr;c=kKLPj%H0gcG8 zmjF}YNWvCV82{+tfCSP}!LEmTfSBr1f8enI>IHNFqf_CYJGAN{Zi|R-*U*R~jWI)R z0^Fd(8SKDyyb7h3Q059%Gx*gu%nN4N(K;h~!sp`Cx#AI6$YTsMC25#}S(S5sQ7o(~ zQL=(K9!^XYG8HC7NOMHeDxKDjAZTd7C*$gwdSgNY5@hH;PaMx;sI$1D5^UWHf2I-z zsrhb!88Unjp8yAEH-W91@nOg`B8FQq;3qqx$U$3NOiEmJHp24(oDB4BAZ`uz|u?hm@MKmQ&oa4k3Tp^!1Qkb=BhzTfUi?Cp^ zUU+4NtRDuSB)0A&UK=idrm&V`f1$8gk+gjanhcZhUraR#;7PzexbTx61TFw#u=Ouv zO<$%DJ>zXL11)QG5(bLJCNuqWy1$nhR)SYAg8Qbc1J6F-5YgdCnG_+Ruaxof@G;j` zD3y2;kch>UYJrqHtO^Jr$1o*b1YixCIGAo$2|zDobH#AILPow&q&C)Je~IFPSCGwd zB6;()dt@qL$*IoF!^qRD8e(;z6-j2Q>QYCl9`bwOWYG?YMN)V8%kTRKfC=4+Kb7lX z;Ue%Q2ITeM!%-OIJvzkD2(&0Fg?JsPBxY?x+zcF>ZRW3mDH&*yBeJ4qpcbriQU@bn z_r%5%Oj1tpEw&O!hSOoke=0K&7yzj@$wUF5S9QD&N9^?+43{t%;O-_~ZWE8c6AY1! zS!W-pa0-3ah$RRMVn@@l7`zQ@$v|N_Vy9t+w2-w;k|(<=47j=)R(%5JJ&jf@=)|i)f$VOjCS8S(9LYn)ET7c$puJH_Z_z0@y z23(y7dY0h2!%)WzC#sF$q_O;(3msoMH0P;k~I1afcDgjS=cu~ zjAb>2?iA&^Yz7!s>0+LZ#@9d0?O&WEt5hV*aW)mjl3-{iVdWI$ z!U%R|Surjc9SUWFh$nDx{ULlY-l#x_hL`gS-jYO|+K3fWfBGW!2GC@&r%7mDjR74a zu#tf4fLj-xN~0{D;xE&n`W`g5p%5`-%UP?v9UZJiB5NmTgJWd92IfUKvCc!i+Pq?N z{F8^%6Yb%ZBK%5w6QD$J9dks(-F+i`MUlbLm;`l3ats2){aF7RW@@xnIL=7Iui)h~ zdND9j@<^&3e}k}KnP)oESa7u~^X|}oEZyP>Fp0)^z$_q_5U`fZ1U3CrD(F8ZcJhj6 z{HKYXpsnk4#MM+J$rETs7p+Jk*@W<2_ECk)=9&RGnd*zg_CsfvBh>zof($gHvM?h}gW++SmaPl^Vz~ zBye*7uqevFg-km+9^pHRal$!RJg{zvi*iNIfP`^UG6QU2(!&vdQY3&5lS-4X72?*BzZArGmTGizaB>0g zHJUxH4aYyC>=m}IqIZxf)>kq+S!}vkf}5#XrbC92|`ljawk7hgqW?j#hgVhBOY7mI2j)M z9Sa>x09xy=8ZeWyq2_>*kti~XedhDc``-= zf8-Mf5m!udr$J*hFSc2@Z7DtjT}aBjf^*FBQ|i6ALOHxUid4$+VuQE5yUg1iaixIF z%K#N(-2VYal7C`x=Vw^uVkC!ciX*tTwdfHBufkj%n@CEy`;WqcN*}wz<$enDfTE>- z3T3@e+qw!wtCzN8?d!d^vBT&{)ZF5TpZm=(>TL6=e4ITOn#+>F$Ia(8iIaj!nAEUW~WP>A{D8X&&Ef35*)Xt2> zgbT}4EC@^$DhW!G)igV**t5%I#9$*(M;<~=2bQnkB03SNO!d7aIX8R)oyM_59nE)O zId^;_viO{N;p0Ta5AdxfT;hS7e?po;#JVp;&h#ETGb5GsE#MnJq^KSlhlo>g^fU~^ zvoX2iDCVAe=G!)G>q@Cyp~TIxU;)gW*Zi{j0)JAgn`()Ogfa6071EY}9IVm6J>0CB zqB-!pgQJHv(a@OLw}8GQw1$d-^Aj-w(XNGw5iMw7cEo$l@;h8b2~F0zf31sKOe<>v z&J$GNW+g>

+$KDDvr0OaLzaGaWQ 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 diff --git a/docs/paper/arxiv-submission/memorywire-paper.tex b/docs/paper/arxiv-submission/memorywire-paper.tex index 30b0615..19be98d 100644 --- a/docs/paper/arxiv-submission/memorywire-paper.tex +++ b/docs/paper/arxiv-submission/memorywire-paper.tex @@ -72,7 +72,7 @@ \subsection{The problem: islanded memory frameworks} Agent runtimes that maintain memory across sessions are now a category. Open-source frameworks include mem0, Letta (formerly MemGPT), Cognee, Zep/Graphiti, MemoryOS, and MemTensor MemOS; closed commercial offerings include Oracle's AI Agent Memory and the memory layers shipped inside major hosted-agent platforms. What the category has not produced is a shared wire format. Each framework defines its own SDK surface, JSON shape for memory records, embedding-provider integration, taxonomy (or absence of taxonomy) for memory types, and implicit lifecycle for record creation and deletion. The heterogeneity is non-trivial to bridge: mem0 stores records under a \texttt{memories[]} list keyed by \texttt{user\_id} with a heterogeneous \texttt{created\_at} representation; Letta stores archival memory keyed by \texttt{agent\_id} and exposes a \texttt{tags} list as the only structured-metadata sink; Cognee mints internal \texttt{data\_id} UUIDs that are not surfaced through its public \texttt{add} API, making per-record deletion impossible from outside the pipeline; sqlite-vec stores tables keyed by a stable ULID-shaped string; pgvector exposes records through an application-chosen SQL schema. Re-platforming an agent from one framework to another therefore requires a bespoke migrator and field-level losses where the source framework encodes more state than the target's data model holds. -The same heterogeneity means there is no shared \emph{governance} surface. Each framework provides a write API and a read API; none mediate the write with a ``diff against current state, present to a human, commit only on approval'' workflow. The Co-memorize human-in-the-loop pattern, formalized in the \emph{Governed Memory} line of work~\cite{taheri2026governed}, has no production implementation an off-the-shelf agent can drop in. Operators who want auditability over what enters long-term memory must build it themselves and accept that the framework can bypass them. +The same heterogeneity means there is no shared \emph{governance} surface. Each framework provides a write API and a read API; none mediate the write with a ``diff against current state, present to a human, commit only on approval'' workflow. Production governance work such as Taheri's \emph{Governed Memory}~\cite{taheri2026governed} enforces write policy automatically across autonomous agents rather than through such a human-approval gate, so this human-in-the-loop workflow has no production implementation an off-the-shelf agent can drop in. Operators who want auditability over what enters long-term memory must build it themselves and accept that the framework can bypass them. This is the gap memorywire addresses. It is not ``we need a better retrieval algorithm'' --- the algorithms in the category (vector search, hybrid lexical-semantic RRF fusion, graph hop boosts, FSM-encoded procedures, STM/LTM consolidation) are well understood. It is ``we need a shared protocol so any client can talk to any backend, any agent can carry its memory across runtimes, and any write can be diffed and approved.'' Structurally it is the gap MCP closed for \emph{tool use}, applied to \emph{memory}. @@ -84,7 +84,7 @@ \subsection{Contributions} \begin{itemize}[leftmargin=*] \item \textbf{C1.} A wire format for five memory operations over four memory types, expressed as JSON Schema 2020-12~\cite{jsonschema_2020_12} (\texttt{docs/spec/v0.md}). The operations are \texttt{remember}, \texttt{recall}, \texttt{forget}, \texttt{merge}, \texttt{expire}; the types are \texttt{semantic}, \texttt{episodic}, \texttt{procedural}, \texttt{emotional}. The schemas are vendor-neutral, transport-agnostic, and explicitly versioned with a breaking-change policy through v0.5. \item \textbf{C2.} A reference implementation in Python 3.11+ with five production-backend adapters (sqlite-vec, mem0, Letta, Cognee, pgvector), all implementing a single \texttt{MemoryStore} Protocol. The reference includes a memory router that fans operations across $N$ stores in parallel and fuses recall results via Reciprocal Rank Fusion ($k=60$)~\cite{cormack2009rrf} with an optional one-hop graph boost, plus a tolerant partial-failure model where a single rogue or unavailable backend cannot crash the operation. - \item \textbf{C3.} A governance UI implementing the Co-memorize diff-and-approve pattern over \texttt{remember}, \texttt{forget}, and \texttt{merge}. Writes flagged \texttt{approval\_required} are staged behind a \texttt{PENDING\_APPROVAL\_DELETED\_AT = -1} sentinel and remain invisible to \texttt{recall} until a reviewer commits or rejects them through the UI. The same audit log is the single source of truth for all governance and mutation events. + \item \textbf{C3.} A governance UI implementing a human-in-the-loop diff-and-approve workflow over \texttt{remember}, \texttt{forget}, and \texttt{merge}. Writes flagged \texttt{approval\_required} are staged behind a \texttt{PENDING\_APPROVAL\_DELETED\_AT = -1} sentinel and remain invisible to \texttt{recall} until a reviewer commits or rejects them through the UI. The same audit log is the single source of truth for all governance and mutation events. \item \textbf{C4.} An empirical evaluation comprising (a)~a microbenchmark on 100 hand-authored facts $\times$ 50 labelled queries against a real sentence-transformer embedder, (b)~an adversarial-fusion experiment that sweeps a 1-of-$N$ rank-0 injection attack across three fusion algorithms (RRF, MAX, weighted), and (c)~a cross-adapter conformance suite of 16 protocol-invariant scenarios run against all five shipped adapters (68 PASS / 12 SKIP / 0 FAIL out of 80 cells). \item \textbf{C5.} A six-adversary threat model with line-level mitigation citations into the reference implementation, plus an open-data artifact (\texttt{docs/adversarial-results.\{rrf,max,weighted\}.json}, the labelled microbench corpus, the conformance scenario list) sufficient to reproduce every empirical claim without re-running paid evaluators. \end{itemize} @@ -97,7 +97,7 @@ \subsection{Limitations, front-loaded} \subsection{Paper roadmap} \label{sec:intro-roadmap} -\Cref{sec:related} places memorywire against prior work in agent memory frameworks, cross-vendor protocols (particularly MCP), and the Governed Memory line. \Cref{sec:spec} specifies the wire format: operations, types, the \texttt{MemoryStore} Protocol, router semantics, and the governance channel. \Cref{sec:impl} describes the reference implementation including the five backend adapters, the procedural-memory FSM backend, the STM$\leftrightarrow$LTM transformer, and the governance UI. \Cref{sec:eval} reports the empirical evaluation. \Cref{sec:threats} is the threat model. \Cref{sec:mcp} details the relationship to MCP. \Cref{sec:future} and \Cref{sec:conclusion} lay out future work and the bet we are making. +\Cref{sec:related} places memorywire against prior work in agent memory frameworks, cross-vendor protocols (particularly MCP), and prior production work on memory governance. \Cref{sec:spec} specifies the wire format: operations, types, the \texttt{MemoryStore} Protocol, router semantics, and the governance channel. \Cref{sec:impl} describes the reference implementation including the five backend adapters, the procedural-memory FSM backend, the STM$\leftrightarrow$LTM transformer, and the governance UI. \Cref{sec:eval} reports the empirical evaluation. \Cref{sec:threats} is the threat model. \Cref{sec:mcp} details the relationship to MCP. \Cref{sec:future} and \Cref{sec:conclusion} lay out future work and the bet we are making. \section{Background and Related Work} \label{sec:related} @@ -133,9 +133,9 @@ \subsection{Human-memory taxonomy} \subsection{Human-in-the-loop approval for agent actions} -The governance channel in memorywire implements the Co-memorize diff-and-approve pattern formalized in the Governed Memory line of work~\cite{taheri2026governed}. The pattern is: when an agent proposes to write a memory, the system computes a structured diff between the proposed write and the current state, presents the diff to a human reviewer, and commits the write only on approval. The pattern generalizes to any state mutation; memorywire applies it to \texttt{remember}, \texttt{forget}, and \texttt{merge}, and excludes \texttt{recall} and \texttt{expire} from the default approval surface (with \texttt{recall} flagged for v0.2 reconsideration; see \Cref{sec:threats}). +The governance channel in memorywire implements a human-in-the-loop diff-and-approve workflow: when an agent proposes to write a memory, the system computes a structured diff between the proposed write and the current state, presents the diff to a human reviewer, and commits the write only on approval. This contrasts with production governance for autonomous agents such as Taheri's \emph{Governed Memory}~\cite{taheri2026governed}, which enforces write policy automatically rather than routing writes through a human gate. The workflow generalizes to any state mutation; memorywire applies it to \texttt{remember}, \texttt{forget}, and \texttt{merge}, and excludes \texttt{recall} and \texttt{expire} from the default approval surface (with \texttt{recall} flagged for v0.2 reconsideration; see \Cref{sec:threats}). -The Co-memorize pattern is not novel to this paper. What is new is its standardization at the wire-format layer: memorywire defines a \texttt{governance} JSON schema for the diff-and-approve message and ships a reference UI that any backend adapter inherits transparently. An agent calling \texttt{remember(content="\ldots", approval\_required=true)} gets the governance flow regardless of which of the five backends actually stores the row. +Diff-and-approve as a review discipline is not itself novel---it mirrors code review and change-management gates. What is new here is its standardization at the wire-format layer: memorywire defines a \texttt{governance} JSON schema for the diff-and-approve message and ships a reference UI that any backend adapter inherits transparently. An agent calling \texttt{remember(content="\ldots", approval\_required=true)} gets the governance flow regardless of which of the five backends actually stores the row. \section{The memorywire Wire Format} \label{sec:spec} @@ -307,7 +307,7 @@ \subsection{The STM$\leftrightarrow$LTM transformer} \subsection{The governance UI} \label{sec:impl-ui} -The governance UI (\texttt{ui/src/memorywire\_ui/}) is a Starlette server with HTMX-driven templates. It shares the sqlite-vec adapter's SQLite database, so a reviewer sees pending writes as rows with the \texttt{PENDING\_APPROVAL\_DELETED\_AT = -1} sentinel in \texttt{deleted\_at} and a \texttt{pending: yes} badge in the UI. Reviewers can approve (clear the sentinel; the row becomes live), reject (hard-delete or soft-delete depending on the policy), or apply a Co-memorize transformation --- typically a \texttt{merge} against an existing canonical row or a \texttt{forget} of a similar row that the new write supersedes. +The governance UI (\texttt{ui/src/memorywire\_ui/}) is a Starlette server with HTMX-driven templates. It shares the sqlite-vec adapter's SQLite database, so a reviewer sees pending writes as rows with the \texttt{PENDING\_APPROVAL\_DELETED\_AT = -1} sentinel in \texttt{deleted\_at} and a \texttt{pending: yes} badge in the UI. Reviewers can approve (clear the sentinel; the row becomes live), reject (hard-delete or soft-delete depending on the policy), or apply a reconciling transformation --- typically a \texttt{merge} against an existing canonical row or a \texttt{forget} of a similar row that the new write supersedes. Authentication is opt-in via the \texttt{MEMORYWIRE\_UI\_TOKEN} environment variable. When set, every request requires either an \texttt{Authorization: Bearer } header or an \texttt{memorywire\_ui\_session} cookie; comparison uses \texttt{hmac.compare\_digest} for constant-time matching. CSRF is enforced through a double-submit-cookie pattern signed with HMAC-SHA256 over \texttt{nonce.ts} with a 24-hour TTL. Without \texttt{MEMORYWIRE\_UI\_TOKEN} the UI is unauthenticated; binding a non-loopback host without a token fires a stderr warning on boot (\texttt{ui/src/memorywire\_ui/middleware.py:55--66}). @@ -600,7 +600,7 @@ \section{Conclusion} \section*{Acknowledgments} -We acknowledge the open-source projects memorywire composes with: mem0, Letta (formerly MemGPT), Cognee, Zep/Graphiti, MemoryOS, MemTensor MemOS, sqlite-vec, pgvector, \texttt{pytransitions}, Starlette, HTMX, sentence-transformers, and the Model Context Protocol community. The Co-memorize diff-and-approve pattern draws on the Governed Memory line of work. RRF as a fusion primitive is from Cormack, Clarke, and B{\"u}ttcher. The human-memory taxonomy mapping follows the cognitive-science literature established by Tulving and Squire. +We acknowledge the open-source projects memorywire composes with: mem0, Letta (formerly MemGPT), Cognee, Zep/Graphiti, MemoryOS, MemTensor MemOS, sqlite-vec, pgvector, \texttt{pytransitions}, Starlette, HTMX, sentence-transformers, and the Model Context Protocol community. RRF as a fusion primitive is from Cormack, Clarke, and B{\"u}ttcher. The human-memory taxonomy mapping follows the cognitive-science literature established by Tulving and Squire. \bibliographystyle{plain} \bibliography{memorywire} diff --git a/docs/paper/arxiv-submission/memorywire.bib b/docs/paper/arxiv-submission/memorywire.bib index 589285f..68f334d 100644 --- a/docs/paper/arxiv-submission/memorywire.bib +++ b/docs/paper/arxiv-submission/memorywire.bib @@ -39,7 +39,8 @@ @misc{packer2023memgpt year = {2023}, eprint = {2310.08560}, archivePrefix = {arXiv}, - primaryClass = {cs.AI} + primaryClass = {cs.AI}, + note = {arXiv:2310.08560} } @misc{wu2024longmemeval, @@ -48,7 +49,8 @@ @misc{wu2024longmemeval year = {2024}, eprint = {2410.10813}, archivePrefix = {arXiv}, - primaryClass = {cs.CL} + primaryClass = {cs.CL}, + note = {arXiv:2410.10813} } @misc{maharana2024locomo, @@ -57,21 +59,22 @@ @misc{maharana2024locomo year = {2024}, eprint = {2402.17753}, archivePrefix = {arXiv}, - primaryClass = {cs.CL} + primaryClass = {cs.CL}, + note = {arXiv:2402.17753} } % Verified via arXiv listing 2026-05-28: arXiv:2603.17787 resolves to a real % paper by Hamed Taheri titled "Governed Memory: A Production Architecture % for Multi-Agent Workflows" (submitted 2026-03-18). The 2603 YYMM prefix % (March 2026) is unusual but valid for an arXiv submission of that month. -% TODO verify arXiv ID before submission (re-check listing close to camera-ready). @misc{taheri2026governed, author = {Taheri, Hamed}, title = {Governed Memory: A Production Architecture for Multi-Agent Workflows}, year = {2026}, eprint = {2603.17787}, archivePrefix = {arXiv}, - primaryClass = {cs.MA} + primaryClass = {cs.AI}, + note = {arXiv:2603.17787} } @misc{chhikara2025mem0, @@ -80,7 +83,8 @@ @misc{chhikara2025mem0 year = {2025}, eprint = {2504.19413}, archivePrefix = {arXiv}, - primaryClass = {cs.AI} + primaryClass = {cs.AI}, + note = {arXiv:2504.19413} } @misc{mcp_spec_2025, diff --git a/docs/paper/memorywire-paper.md b/docs/paper/memorywire-paper.md index f3d263b..17210f1 100644 --- a/docs/paper/memorywire-paper.md +++ b/docs/paper/memorywire-paper.md @@ -19,7 +19,7 @@ Agent-memory frameworks --- mem0, Letta/MemGPT, Cognee, Zep/Graphiti, MemoryOS, Agent runtimes that maintain memory across sessions are now a category. Open-source frameworks include mem0, Letta (formerly MemGPT), Cognee, Zep/Graphiti, MemoryOS, and MemTensor MemOS; closed commercial offerings include Oracle's AI Agent Memory and the memory layers shipped inside major hosted-agent platforms. What the category has not produced is a shared wire format. Each framework defines its own SDK surface, JSON shape for memory records, embedding-provider integration, taxonomy (or absence of taxonomy) for memory types, and implicit lifecycle for record creation and deletion. The heterogeneity is non-trivial to bridge: mem0 stores records under a `memories[]` list keyed by `user_id` with a heterogeneous `created_at` representation; Letta stores archival memory keyed by `agent_id` and exposes a `tags` list as the only structured-metadata sink; Cognee mints internal `data_id` UUIDs that are not surfaced through its public `add` API, making per-record deletion impossible from outside the pipeline; sqlite-vec stores tables keyed by a stable ULID-shaped string; pgvector exposes records through an application-chosen SQL schema. Re-platforming an agent from one framework to another therefore requires a bespoke migrator and field-level losses where the source framework encodes more state than the target's data model holds. -The same heterogeneity means there is no shared *governance* surface. Each framework provides a write API and a read API; none mediate the write with a "diff against current state, present to a human, commit only on approval" workflow. The Co-memorize human-in-the-loop pattern, formalized in the *Governed Memory* line of work, has no production implementation an off-the-shelf agent can drop in. Operators who want auditability over what enters long-term memory must build it themselves and accept that the framework can bypass them. +The same heterogeneity means there is no shared *governance* surface. Each framework provides a write API and a read API; none mediate the write with a "diff against current state, present to a human, commit only on approval" workflow. Production governance work such as Taheri's *Governed Memory* (arXiv:2603.17787) enforces write policy automatically across autonomous agents rather than through such a human-approval gate, so this human-in-the-loop workflow has no production implementation an off-the-shelf agent can drop in. Operators who want auditability over what enters long-term memory must build it themselves and accept that the framework can bypass them. This is the gap memorywire addresses. It is not "we need a better retrieval algorithm" — the algorithms in the category (vector search, hybrid lexical-semantic RRF fusion, graph hop boosts, FSM-encoded procedures, STM/LTM consolidation) are well understood. It is "we need a shared protocol so any client can talk to any backend, any agent can carry its memory across runtimes, and any write can be diffed and approved." Structurally it is the gap MCP closed for *tool use*, applied to *memory*. @@ -29,7 +29,7 @@ This paper makes five contributions: - **C1.** A wire format for five memory operations over four memory types, expressed as JSON Schema 2020-12 (`docs/spec/v0.md`). The operations are `remember`, `recall`, `forget`, `merge`, `expire`; the types are `semantic`, `episodic`, `procedural`, `emotional`. The schemas are vendor-neutral, transport-agnostic (REST-friendly request/response idiom that translates mechanically to JSON-RPC), and explicitly versioned with a breaking-change policy through v0.5. - **C2.** A reference implementation in Python 3.11+ with five production-backend adapters (sqlite-vec, mem0, Letta, Cognee, pgvector), all implementing a single `MemoryStore` Protocol. The reference includes a memory router that fans operations across N stores in parallel and fuses recall results via Reciprocal Rank Fusion (k=60) with an optional one-hop graph boost, plus a tolerant partial-failure model where a single rogue or unavailable backend cannot crash the operation. -- **C3.** A governance UI implementing the Co-memorize diff-and-approve pattern over `remember`, `forget`, and `merge`. Writes flagged `approval_required` are staged behind a `PENDING_APPROVAL_DELETED_AT = -1` sentinel and remain invisible to `recall` until a reviewer commits or rejects them through the UI. The same audit log is the single source of truth for all governance and mutation events. +- **C3.** A governance UI implementing a human-in-the-loop diff-and-approve workflow over `remember`, `forget`, and `merge`. Writes flagged `approval_required` are staged behind a `PENDING_APPROVAL_DELETED_AT = -1` sentinel and remain invisible to `recall` until a reviewer commits or rejects them through the UI. The same audit log is the single source of truth for all governance and mutation events. - **C4.** An empirical evaluation comprising (a) a microbenchmark on 100 hand-authored facts × 50 labelled queries against a real sentence-transformer embedder, (b) an adversarial-fusion experiment that sweeps a 1-of-N rank-0 injection attack across three fusion algorithms (RRF, MAX, weighted), and (c) a cross-adapter conformance suite of 16 protocol-invariant scenarios run against all five shipped adapters (68 PASS / 12 SKIP / 0 FAIL out of 80 cells). - **C5.** A six-adversary threat model with line-level mitigation citations into the reference implementation, plus an open-data artifact (`docs/adversarial-results.{rrf,max,weighted}.json`, the labelled microbench corpus, the conformance scenario list) sufficient to reproduce every empirical claim without re-running paid evaluators. @@ -39,7 +39,7 @@ We state up front what this paper is *not*. It is not a new algorithm: RRF is fr ### 1.4 Paper roadmap -Section 2 places memorywire against prior work in agent memory frameworks, cross-vendor protocols (particularly MCP), and the Governed Memory line. Section 3 specifies the wire format: operations, types, the `MemoryStore` Protocol, router semantics, and the governance channel. Section 4 describes the reference implementation including the five backend adapters, the procedural-memory FSM backend, the STM↔LTM transformer, and the governance UI. Section 5 reports the empirical evaluation. Section 6 is the threat model. Section 7 details the relationship to MCP. Sections 8 and 9 lay out future work and the bet we are making. +Section 2 places memorywire against prior work in agent memory frameworks, cross-vendor protocols (particularly MCP), and prior production work on memory governance. Section 3 specifies the wire format: operations, types, the `MemoryStore` Protocol, router semantics, and the governance channel. Section 4 describes the reference implementation including the five backend adapters, the procedural-memory FSM backend, the STM↔LTM transformer, and the governance UI. Section 5 reports the empirical evaluation. Section 6 is the threat model. Section 7 details the relationship to MCP. Sections 8 and 9 lay out future work and the bet we are making. ## 2. Background and Related Work @@ -75,9 +75,9 @@ We do not claim that the four-type taxonomy is the *correct* one in any deep sen ### 2.5 Human-in-the-loop approval for agent actions -The governance channel in memorywire implements the Co-memorize diff-and-approve pattern formalized in the Governed Memory line of work (Taheri, arXiv:2603.17787, 2026). The pattern is: when an agent proposes to write a memory, the system computes a structured diff between the proposed write and the current state, presents the diff to a human reviewer, and commits the write only on approval. The pattern generalizes to any state mutation; memorywire applies it to `remember`, `forget`, and `merge`, and excludes `recall` and `expire` from the default approval surface (with `recall` flagged for v0.2 reconsideration; see §6). +The governance channel in memorywire implements a human-in-the-loop diff-and-approve workflow: when an agent proposes to write a memory, the system computes a structured diff between the proposed write and the current state, presents the diff to a human reviewer, and commits the write only on approval. This contrasts with production governance for autonomous agents such as Taheri's *Governed Memory* (arXiv:2603.17787, 2026), which enforces write policy automatically rather than routing writes through a human gate. The workflow generalizes to any state mutation; memorywire applies it to `remember`, `forget`, and `merge`, and excludes `recall` and `expire` from the default approval surface (with `recall` flagged for v0.2 reconsideration; see §6). -The Co-memorize pattern is not novel to this paper. What is new is its standardization at the wire-format layer: memorywire defines a `governance` JSON schema for the diff-and-approve message and ships a reference UI that any backend adapter inherits transparently. An agent calling `remember(content="…", approval_required=true)` gets the governance flow regardless of which of the five backends actually stores the row. +Diff-and-approve as a review discipline is not itself novel — it mirrors code review and change-management gates. What is new here is its standardization at the wire-format layer: memorywire defines a `governance` JSON schema for the diff-and-approve message and ships a reference UI that any backend adapter inherits transparently. An agent calling `remember(content="…", approval_required=true)` gets the governance flow regardless of which of the five backends actually stores the row. ## 3. The memorywire Wire Format @@ -217,7 +217,7 @@ The transformer is deliberately simple. The point is not to invent a new consoli ### 4.5 The governance UI -The governance UI (`ui/src/amp_ui/`) is a Starlette server with HTMX-driven templates. It shares the sqlite-vec adapter's SQLite database, so a reviewer sees pending writes as rows with the `PENDING_APPROVAL_DELETED_AT = -1` sentinel in `deleted_at` and a `pending: yes` badge in the UI. Reviewers can approve (clear the sentinel; the row becomes live), reject (hard-delete or soft-delete depending on the policy), or apply a Co-memorize transformation — typically a `merge` against an existing canonical row or a `forget` of a similar row that the new write supersedes. +The governance UI (`ui/src/amp_ui/`) is a Starlette server with HTMX-driven templates. It shares the sqlite-vec adapter's SQLite database, so a reviewer sees pending writes as rows with the `PENDING_APPROVAL_DELETED_AT = -1` sentinel in `deleted_at` and a `pending: yes` badge in the UI. Reviewers can approve (clear the sentinel; the row becomes live), reject (hard-delete or soft-delete depending on the policy), or apply a reconciling transformation — typically a `merge` against an existing canonical row or a `forget` of a similar row that the new write supersedes. Authentication is opt-in via the `MEMORYWIRE_UI_TOKEN` environment variable. When set, every request requires either an `Authorization: Bearer ` header or an `memorywire_ui_session` cookie; comparison uses `hmac.compare_digest` for constant-time matching. CSRF is enforced through a double-submit-cookie pattern signed with HMAC-SHA256 over `nonce.ts` with a 24-hour TTL. Without `MEMORYWIRE_UI_TOKEN` the UI is unauthenticated; binding a non-loopback host without a token fires a stderr warning on boot (`ui/src/amp_ui/middleware.py:55-66`). @@ -432,7 +432,7 @@ We are honest about the bet. The algorithmic substrate (RRF, FSMs, STM/LTM, diff ## Acknowledgments -We acknowledge the open-source projects memorywire composes with: mem0, Letta (formerly MemGPT), Cognee, Zep/Graphiti, MemoryOS, MemTensor MemOS, sqlite-vec, pgvector, `pytransitions`, Starlette, HTMX, sentence-transformers, and the Model Context Protocol community. The Co-memorize diff-and-approve pattern draws on the Governed Memory line of work. RRF as a fusion primitive is from Cormack, Clarke, and Buettcher. The human-memory taxonomy mapping follows the cognitive-science literature established by Tulving and Squire. +We acknowledge the open-source projects memorywire composes with: mem0, Letta (formerly MemGPT), Cognee, Zep/Graphiti, MemoryOS, MemTensor MemOS, sqlite-vec, pgvector, `pytransitions`, Starlette, HTMX, sentence-transformers, and the Model Context Protocol community. RRF as a fusion primitive is from Cormack, Clarke, and Buettcher. The human-memory taxonomy mapping follows the cognitive-science literature established by Tulving and Squire. ## References diff --git a/docs/paper/memorywire-paper.tex b/docs/paper/memorywire-paper.tex index e0aa8df..cf3111c 100644 --- a/docs/paper/memorywire-paper.tex +++ b/docs/paper/memorywire-paper.tex @@ -69,7 +69,7 @@ \subsection{The problem: islanded memory frameworks} Agent runtimes that maintain memory across sessions are now a category. Open-source frameworks include mem0, Letta (formerly MemGPT), Cognee, Zep/Graphiti, MemoryOS, and MemTensor MemOS; closed commercial offerings include Oracle's AI Agent Memory and the memory layers shipped inside major hosted-agent platforms. What the category has not produced is a shared wire format. Each framework defines its own SDK surface, JSON shape for memory records, embedding-provider integration, taxonomy (or absence of taxonomy) for memory types, and implicit lifecycle for record creation and deletion. The heterogeneity is non-trivial to bridge: mem0 stores records under a \texttt{memories[]} list keyed by \texttt{user\_id} with a heterogeneous \texttt{created\_at} representation; Letta stores archival memory keyed by \texttt{agent\_id} and exposes a \texttt{tags} list as the only structured-metadata sink; Cognee mints internal \texttt{data\_id} UUIDs that are not surfaced through its public \texttt{add} API, making per-record deletion impossible from outside the pipeline; sqlite-vec stores tables keyed by a stable ULID-shaped string; pgvector exposes records through an application-chosen SQL schema. Re-platforming an agent from one framework to another therefore requires a bespoke migrator and field-level losses where the source framework encodes more state than the target's data model holds. -The same heterogeneity means there is no shared \emph{governance} surface. Each framework provides a write API and a read API; none mediate the write with a ``diff against current state, present to a human, commit only on approval'' workflow. The Co-memorize human-in-the-loop pattern, formalized in the \emph{Governed Memory} line of work~\cite{taheri2026governed}, has no production implementation an off-the-shelf agent can drop in. Operators who want auditability over what enters long-term memory must build it themselves and accept that the framework can bypass them. +The same heterogeneity means there is no shared \emph{governance} surface. Each framework provides a write API and a read API; none mediate the write with a ``diff against current state, present to a human, commit only on approval'' workflow. Production governance work such as Taheri's \emph{Governed Memory}~\cite{taheri2026governed} enforces write policy automatically across autonomous agents rather than through such a human-approval gate, so this human-in-the-loop workflow has no production implementation an off-the-shelf agent can drop in. Operators who want auditability over what enters long-term memory must build it themselves and accept that the framework can bypass them. This is the gap memorywire addresses. It is not ``we need a better retrieval algorithm'' --- the algorithms in the category (vector search, hybrid lexical-semantic RRF fusion, graph hop boosts, FSM-encoded procedures, STM/LTM consolidation) are well understood. It is ``we need a shared protocol so any client can talk to any backend, any agent can carry its memory across runtimes, and any write can be diffed and approved.'' Structurally it is the gap MCP closed for \emph{tool use}, applied to \emph{memory}. @@ -81,7 +81,7 @@ \subsection{Contributions} \begin{itemize}[leftmargin=*] \item \textbf{C1.} A wire format for five memory operations over four memory types, expressed as JSON Schema 2020-12~\cite{jsonschema_2020_12} (\texttt{docs/spec/v0.md}). The operations are \texttt{remember}, \texttt{recall}, \texttt{forget}, \texttt{merge}, \texttt{expire}; the types are \texttt{semantic}, \texttt{episodic}, \texttt{procedural}, \texttt{emotional}. The schemas are vendor-neutral, transport-agnostic, and explicitly versioned with a breaking-change policy through v0.5. \item \textbf{C2.} A reference implementation in Python 3.11+ with five production-backend adapters (sqlite-vec, mem0, Letta, Cognee, pgvector), all implementing a single \texttt{MemoryStore} Protocol. The reference includes a memory router that fans operations across $N$ stores in parallel and fuses recall results via Reciprocal Rank Fusion ($k=60$)~\cite{cormack2009rrf} with an optional one-hop graph boost, plus a tolerant partial-failure model where a single rogue or unavailable backend cannot crash the operation. - \item \textbf{C3.} A governance UI implementing the Co-memorize diff-and-approve pattern over \texttt{remember}, \texttt{forget}, and \texttt{merge}. Writes flagged \texttt{approval\_required} are staged behind a \texttt{PENDING\_APPROVAL\_DELETED\_AT = -1} sentinel and remain invisible to \texttt{recall} until a reviewer commits or rejects them through the UI. The same audit log is the single source of truth for all governance and mutation events. + \item \textbf{C3.} A governance UI implementing a human-in-the-loop diff-and-approve workflow over \texttt{remember}, \texttt{forget}, and \texttt{merge}. Writes flagged \texttt{approval\_required} are staged behind a \texttt{PENDING\_APPROVAL\_DELETED\_AT = -1} sentinel and remain invisible to \texttt{recall} until a reviewer commits or rejects them through the UI. The same audit log is the single source of truth for all governance and mutation events. \item \textbf{C4.} An empirical evaluation comprising (a)~a microbenchmark on 100 hand-authored facts $\times$ 50 labelled queries against a real sentence-transformer embedder, (b)~an adversarial-fusion experiment that sweeps a 1-of-$N$ rank-0 injection attack across three fusion algorithms (RRF, MAX, weighted), and (c)~a cross-adapter conformance suite of 16 protocol-invariant scenarios run against all five shipped adapters (68 PASS / 12 SKIP / 0 FAIL out of 80 cells). \item \textbf{C5.} A six-adversary threat model with line-level mitigation citations into the reference implementation, plus an open-data artifact (\texttt{docs/adversarial-results.\{rrf,max,weighted\}.json}, the labelled microbench corpus, the conformance scenario list) sufficient to reproduce every empirical claim without re-running paid evaluators. \end{itemize} @@ -94,7 +94,7 @@ \subsection{Limitations, front-loaded} \subsection{Paper roadmap} \label{sec:intro-roadmap} -\Cref{sec:related} places memorywire against prior work in agent memory frameworks, cross-vendor protocols (particularly MCP), and the Governed Memory line. \Cref{sec:spec} specifies the wire format: operations, types, the \texttt{MemoryStore} Protocol, router semantics, and the governance channel. \Cref{sec:impl} describes the reference implementation including the five backend adapters, the procedural-memory FSM backend, the STM$\leftrightarrow$LTM transformer, and the governance UI. \Cref{sec:eval} reports the empirical evaluation. \Cref{sec:threats} is the threat model. \Cref{sec:mcp} details the relationship to MCP. \Cref{sec:future} and \Cref{sec:conclusion} lay out future work and the bet we are making. +\Cref{sec:related} places memorywire against prior work in agent memory frameworks, cross-vendor protocols (particularly MCP), and prior production work on memory governance. \Cref{sec:spec} specifies the wire format: operations, types, the \texttt{MemoryStore} Protocol, router semantics, and the governance channel. \Cref{sec:impl} describes the reference implementation including the five backend adapters, the procedural-memory FSM backend, the STM$\leftrightarrow$LTM transformer, and the governance UI. \Cref{sec:eval} reports the empirical evaluation. \Cref{sec:threats} is the threat model. \Cref{sec:mcp} details the relationship to MCP. \Cref{sec:future} and \Cref{sec:conclusion} lay out future work and the bet we are making. \section{Background and Related Work} \label{sec:related} @@ -130,9 +130,9 @@ \subsection{Human-memory taxonomy} \subsection{Human-in-the-loop approval for agent actions} -The governance channel in memorywire implements the Co-memorize diff-and-approve pattern formalized in the Governed Memory line of work~\cite{taheri2026governed}. The pattern is: when an agent proposes to write a memory, the system computes a structured diff between the proposed write and the current state, presents the diff to a human reviewer, and commits the write only on approval. The pattern generalizes to any state mutation; memorywire applies it to \texttt{remember}, \texttt{forget}, and \texttt{merge}, and excludes \texttt{recall} and \texttt{expire} from the default approval surface (with \texttt{recall} flagged for v0.2 reconsideration; see \Cref{sec:threats}). +The governance channel in memorywire implements a human-in-the-loop diff-and-approve workflow: when an agent proposes to write a memory, the system computes a structured diff between the proposed write and the current state, presents the diff to a human reviewer, and commits the write only on approval. This contrasts with production governance for autonomous agents such as Taheri's \emph{Governed Memory}~\cite{taheri2026governed}, which enforces write policy automatically rather than routing writes through a human gate. The workflow generalizes to any state mutation; memorywire applies it to \texttt{remember}, \texttt{forget}, and \texttt{merge}, and excludes \texttt{recall} and \texttt{expire} from the default approval surface (with \texttt{recall} flagged for v0.2 reconsideration; see \Cref{sec:threats}). -The Co-memorize pattern is not novel to this paper. What is new is its standardization at the wire-format layer: memorywire defines a \texttt{governance} JSON schema for the diff-and-approve message and ships a reference UI that any backend adapter inherits transparently. An agent calling \texttt{remember(content="\ldots", approval\_required=true)} gets the governance flow regardless of which of the five backends actually stores the row. +Diff-and-approve as a review discipline is not itself novel---it mirrors code review and change-management gates. What is new here is its standardization at the wire-format layer: memorywire defines a \texttt{governance} JSON schema for the diff-and-approve message and ships a reference UI that any backend adapter inherits transparently. An agent calling \texttt{remember(content="\ldots", approval\_required=true)} gets the governance flow regardless of which of the five backends actually stores the row. \section{The memorywire Wire Format} \label{sec:spec} @@ -304,7 +304,7 @@ \subsection{The STM$\leftrightarrow$LTM transformer} \subsection{The governance UI} \label{sec:impl-ui} -The governance UI (\texttt{ui/src/memorywire\_ui/}) is a Starlette server with HTMX-driven templates. It shares the sqlite-vec adapter's SQLite database, so a reviewer sees pending writes as rows with the \texttt{PENDING\_APPROVAL\_DELETED\_AT = -1} sentinel in \texttt{deleted\_at} and a \texttt{pending: yes} badge in the UI. Reviewers can approve (clear the sentinel; the row becomes live), reject (hard-delete or soft-delete depending on the policy), or apply a Co-memorize transformation --- typically a \texttt{merge} against an existing canonical row or a \texttt{forget} of a similar row that the new write supersedes. +The governance UI (\texttt{ui/src/memorywire\_ui/}) is a Starlette server with HTMX-driven templates. It shares the sqlite-vec adapter's SQLite database, so a reviewer sees pending writes as rows with the \texttt{PENDING\_APPROVAL\_DELETED\_AT = -1} sentinel in \texttt{deleted\_at} and a \texttt{pending: yes} badge in the UI. Reviewers can approve (clear the sentinel; the row becomes live), reject (hard-delete or soft-delete depending on the policy), or apply a reconciling transformation --- typically a \texttt{merge} against an existing canonical row or a \texttt{forget} of a similar row that the new write supersedes. Authentication is opt-in via the \texttt{MEMORYWIRE\_UI\_TOKEN} environment variable. When set, every request requires either an \texttt{Authorization: Bearer } header or an \texttt{memorywire\_ui\_session} cookie; comparison uses \texttt{hmac.compare\_digest} for constant-time matching. CSRF is enforced through a double-submit-cookie pattern signed with HMAC-SHA256 over \texttt{nonce.ts} with a 24-hour TTL. Without \texttt{MEMORYWIRE\_UI\_TOKEN} the UI is unauthenticated; binding a non-loopback host without a token fires a stderr warning on boot (\texttt{ui/src/memorywire\_ui/middleware.py:55--66}). @@ -570,7 +570,7 @@ \section{Conclusion} \section*{Acknowledgments} -We acknowledge the open-source projects memorywire composes with: mem0, Letta (formerly MemGPT), Cognee, Zep/Graphiti, MemoryOS, MemTensor MemOS, sqlite-vec, pgvector, \texttt{pytransitions}, Starlette, HTMX, sentence-transformers, and the Model Context Protocol community. The Co-memorize diff-and-approve pattern draws on the Governed Memory line of work. RRF as a fusion primitive is from Cormack, Clarke, and B{\"u}ttcher. The human-memory taxonomy mapping follows the cognitive-science literature established by Tulving and Squire. +We acknowledge the open-source projects memorywire composes with: mem0, Letta (formerly MemGPT), Cognee, Zep/Graphiti, MemoryOS, MemTensor MemOS, sqlite-vec, pgvector, \texttt{pytransitions}, Starlette, HTMX, sentence-transformers, and the Model Context Protocol community. RRF as a fusion primitive is from Cormack, Clarke, and B{\"u}ttcher. The human-memory taxonomy mapping follows the cognitive-science literature established by Tulving and Squire. \bibliographystyle{plain} \bibliography{memorywire} diff --git a/docs/paper/memorywire.bib b/docs/paper/memorywire.bib index 589285f..68f334d 100644 --- a/docs/paper/memorywire.bib +++ b/docs/paper/memorywire.bib @@ -39,7 +39,8 @@ @misc{packer2023memgpt year = {2023}, eprint = {2310.08560}, archivePrefix = {arXiv}, - primaryClass = {cs.AI} + primaryClass = {cs.AI}, + note = {arXiv:2310.08560} } @misc{wu2024longmemeval, @@ -48,7 +49,8 @@ @misc{wu2024longmemeval year = {2024}, eprint = {2410.10813}, archivePrefix = {arXiv}, - primaryClass = {cs.CL} + primaryClass = {cs.CL}, + note = {arXiv:2410.10813} } @misc{maharana2024locomo, @@ -57,21 +59,22 @@ @misc{maharana2024locomo year = {2024}, eprint = {2402.17753}, archivePrefix = {arXiv}, - primaryClass = {cs.CL} + primaryClass = {cs.CL}, + note = {arXiv:2402.17753} } % Verified via arXiv listing 2026-05-28: arXiv:2603.17787 resolves to a real % paper by Hamed Taheri titled "Governed Memory: A Production Architecture % for Multi-Agent Workflows" (submitted 2026-03-18). The 2603 YYMM prefix % (March 2026) is unusual but valid for an arXiv submission of that month. -% TODO verify arXiv ID before submission (re-check listing close to camera-ready). @misc{taheri2026governed, author = {Taheri, Hamed}, title = {Governed Memory: A Production Architecture for Multi-Agent Workflows}, year = {2026}, eprint = {2603.17787}, archivePrefix = {arXiv}, - primaryClass = {cs.MA} + primaryClass = {cs.AI}, + note = {arXiv:2603.17787} } @misc{chhikara2025mem0, @@ -80,7 +83,8 @@ @misc{chhikara2025mem0 year = {2025}, eprint = {2504.19413}, archivePrefix = {arXiv}, - primaryClass = {cs.AI} + primaryClass = {cs.AI}, + note = {arXiv:2504.19413} } @misc{mcp_spec_2025, diff --git a/docs/spec/v0.md b/docs/spec/v0.md index 58c486b..961d627 100644 --- a/docs/spec/v0.md +++ b/docs/spec/v0.md @@ -486,7 +486,7 @@ Memory research informing the design: - LoCoMo benchmark - BEAM benchmark - "Remember Me, Refine Me" — procedural memory -- "Governed Memory" arXiv 2603.17787 — Co-memorize HITL +- "Governed Memory" arXiv 2603.17787 — automated agent-memory governance (human-gated contrast) - Mem0 architecture writeup - Letta (MemGPT) hierarchical memory paper