fLO$FXfqNC42;%YenS~-qxeOhZA<$iBLzpm%n-Ub-Ppyio4$ugCk
zNR^)|EePLT>?OsrVJWo7CGk(MXl(B)4F9xdb
zy_b2BKx1L4px_BxSRQV<5KsFpI0L%y})G_iU1rV4;oV`
z6dp?hgW@bIa&Z!ZFxXm1eRH4{tzc3b8DUdmlU0lV3#6<@v!E^+0d-@l6W@2KaUGV&
zl|0T4N5m45x{WQGf#^=4`Ncg
z7d=s&ip8pc{_I3wI+bDvE=(h4;lxnFYUCP~Xg`lCr+R(EU?i%?Rx+Ua_?tSBa_4I0
zV>RwnX3X&C();p|NidI~v_3#vZ{-ovZ#-T^>Da9Ohg3eiFJp&?=pQOwj=tf{x*nys
zuU#vzgsqtc9Szrx>5|(bOBj-gyIzue&lDPmzlvd2J81Q;zkK9vPHL@0|8r%6eDzh;
z^AB}L3sIQT4+B(6m7y0H`7DG@*XPx+imQ{+*!qX&ZKODMxb+>T0*sw?tf&KgE5kFn
zgx|x#k1U$Ss^#*m8aQ{GgSboab*3r7
z_ICzl#P`GdZG!bRqXcw
z%`RR=wjUJpW$;m^t}j7p8OJj>KLdXXhOXlj2O%FyvkK$tvf@OZ=Rv^yR8nDuO>u0w
zAyr2zGS>KBE{Vr)V`=LtA4X-Xv7`obv0K#D2qZx4{Wm#-Ue3SqD#K
z5Q)>mGY9guv}7v&s8@$Uv@kj1#2^PBBU5N$ohGwP>P!u5EXp4(Vh?sMqdu&xvne9|
zQwQ|UFD*nkYG!z=4gu$g45P6U6zE8Y6B)RhE^O@Hq`W8t10jJ%sf_lD-?|WXFjO+J
zVzD_;`7B^a9$~Zaef{(~nQtoMXus?ExIv7YyN`upF}a?yq{t;Q=h_zCviUoBsRSHQguQjbz*8n);tx;Rvu
zfDyR=>`bA8oogDGssV3|h+y=1%V~5Q&nM7-`y;rqfpPw_f+eq7=iipkF;0QudyX3<
z510;Z63NJ!>u$`QpzK%#uxCtKOGd(WH!#!uRGxDdi7Znz_AJlj{5d)=PM?~72OTP0>080?(#$nB=WurHHTj!wBvDw%L&@HHq)K{R
zvq6{{jcnBp-8`+w&A?qx(DptE0Ez?X7bF4UtRZm}x_|EZU|c}?u%_`eg6_i{L;7XO
z0wnz+ov#f<@7fTwDRNP?1oDV?F!<)5M$M}E!P
z=r3I#3BIpXuz#5P$%u#dEJ>@L^g7bB5NZ9}+Ji&N)KFxPk%S(1!m}ehp~X54@30}V
zpmja#!F=7mlwP-U?zN&=Kv=~I#?JSL?+$yeo}qFnB~zP+6wa~eNKOCP&{CB$A9dev
z^AN8i>P`Fj!S&%~+>NTqEG!uE;Pbt(6}DI-0T<*XcVv@$TRiK2w%*`7f@NHAC?#H~
z=fLzfOdX3o=Da%MvKRE`@AcAx3=eWstrF3{O$g3QKPEYFQ5WU1v*0uyyPw^yKNe2a
z^liorl`DMbdt|JMZubda``W?b_Cgc&-Y3v1`Z(nGP(CHZIq
z#1x!tc_gHQ}$VP``Ink#!;ev;o$~Dba|f1l(`-637n&*BrSjPnWhcWX0GmdmIrmp
zIR`c&uu11GA*3Ib2dwt(y3}?y$ulfpyT35~uGr|)uIuA+yQs@EoZa;-u!rDE)P9E|
z{btOGP-H=9k@c>FHxhL_`-c`&Uwu6Ajy@3qhk#OjN%zHN5u2tVYGRjyjJ1_^tO{G}
z?KdCs2pClHPzF`5foo%{Noo*waGSMT96rpzOFAS$IlKJX#;nUV$15ym>Yv$NK7%i|
zq;Po9r*}8eC-@wR}_oE{ed^x
zRz(EaA9h_Vr7Ueawg4yScOvnu@Z#I2F>LxQ#iO@eY_i8;UwzbdGbZWEZc_{FL{eyU
zrES8KMMi>iTYmX}8UK0fLd2PMJ)Lrb0g;-Jyd$kZv)5_Q5YdmX@%;_hvBd_JbH3v|
zklkpd?kvM2qN&?QDw&U*h=+hb2HenFf|EA4mj&%h`z%RCX9QsqUQqZvtZi>hvgQ+oHsWryWMgxCq(&S$Tg6qj%X}mE@WYOt2e^Or5CNrV#)(4+_aM
z;q;Hvn{XnxAABk_R5f!*5_?-&XrDG~w0^GB5K+9WC897VvMl!vU7F`NKJ|{2k-&Nxp^uHQ}enrg8@qYQzBR1^i
z?3@uVnUFhL>dO&dLg+wMPVA!8{&@yPp)~O(IDX`Su;REeWS&y91L?B>QXVtsF`Q>Q=m9eCvs=1FdIM^dkLqXDl(YWdabh~Zri;OskX{ZwopBDd=f>3
z{8S(8lJ3N*@LS^SQt^!3&Z@&7@MN}9KSW=h1tf>^5OA>KOYNQH4-7smnQMo0buy~{
z=HFv!`8q&Yo-_$hNz
z+SY983#y`ET)X)6;>P>Bwwpxbi|J!VG#mklBbU$_R1$Fb^2?8Cy<2KE7;`qtZxgeil_Pom9!oJ)QHcwzkWZ?vHowihPGL>?*u2*y`(9C|aJu3@uS{V6E3jGO
z)~+E=j}!M<#~KD*>HXmq{oBI@R-cTYunz0xuR3*^DI2pJ80thb>A70sXfpm~uf+m=wb4j(;8efWim*UGe=REy#Bz
z86_z&eb3v%o%G;m%$|dsnTMY+Dr0s=a#wF{zrJ4Sv@HHvteak#cnxy`@-ak8R9b(}
zTx`-lIU&a(z3OexVP`TUlrhzy-h`|$|4JW&IrO*ZXD6&7T4}Ix+b@@0v_ke>a{NX
zg}Pau(lhq~dlgrqAKPq{)Iyt0g3ff2t7-?q3ozd{u<=|^&fc;SMZ-0NGK>F&JP+wu
zZL8=~e)>IsLeb?!nYf`vu-d)U{)?q1EeaPoGiwVon($~U1Et_o>)1sLm_d#xI58cD
zYZh&nU8&Bz{-bv?veoDD(2Ukgo()exr+=09v>8h4=GT+l<4y=#EPf-~lgVwk
zu~k$HyygCZgBa6;p8ez4KBa=*;xE5{K-6=XCXYY>Zvwgs=7(gZ4)&3Moka}0rdPN_
zuOdF&-vk?41v2c*R+Qc9GQq)f5x9gj&6z|daeygvr1#X>7?fL`>H&0RRn9M-8
z32}v5OapX7D@~)@v(CflAL}$Ur@=(wPInkreF{HOO2}DQsxWB3HS(I}s={>#&%NQ-
z#V3Yhh+&T%Bu}Ke6jo4i)UwG_-#H=2^=fdMNd8Q&gjS_X#v&-C;oXI%RjzZqF$!B^
z2PvYX10yu&J0SXoCV%lr+1Kgat(Pc}{iJI5l$cjvWijB^M{{B^p~(Htt}AU2wD5rF24EIRJeKo+zM?
zxhH2E6S0q=bM*P=D5jTeBn`2)R$`~#Ws8i0DNn;IR1bo`TgY_Xs`HWZ$gWdYFMr)`
zr%wKPkLuOIWzRnLSmXGD!5QuY!z{6_e3qo1=DrTo=;7W5SS`I^3khrMziBNDPi
zvv%tj3NTB~GM0+E2*KDWW~(d>nnB?Ye(GJ6v=viz^6eX~X2U!5$R9Y*bT#4+RKV<*Au&ekx$#V(d0k3vQ9SVF
z4t!k*`Eb7$<~^ft`f##Y$!1CKR!B$hKA@C0pXx;f0bFPO;76$DqbE-rE3~f$-QY#y
zQdZ1it6x6*eZ;uuL3qvix~_@NG7m|%4U!6Uws)aMf)t5C!9jNgjmmTlC@
zpPA0ss`{lwY|Q!Ct@XQwo?7(;W7*70g#Q;^4WjbVqt&pCts*y0@H<8VUN#(OUy|I?
zoh%Jn+q!p#bU_fVc%$3m`tH{+dd0Smo|2tM!L7H*
zA{@v@skhXtZ6`K9d>5NXwc{%5Nq096J}%4Bx+zkyJ&Gpp2I^|JH$H|adJ)_YpwsV*XE>P|{^bC+08WS|sik|0cw^Ym(+
z3~K4AM-u$*&Zqj7+Lp?C@kXB`)~wG8w(Xf1I!l-qdzi!fq6pZq?kimGOTT8TejBwu
zo@@G#x^w7*?yO5GI^Mu^E&3aru&8O~bia-DOnm4w>s4pG&b-l-{EaedN$(KTh4Zxy
z;(NPez$3xAL2w0Ni4#?4>ms`TLqb%0f3IycYC
zopq%NYp!Vg`yC?Hqa@7{4F?sBX;262(Z-Su#G9ZuszU;MkT
zDI&fe=U5y_MZvfS?EN-pD}X(S$d
z=9@S5sVuY{Sw5g$^>r;vcVygj`9^zpxzS*(k&ukk)uGM>I@onuxa2ofPtb2)3{28?
z+P6k>AC_CidK!(%*{ADRgVYSVDn4!;=BuB&l&S5qY^fPC$Xm|uwCHXZ1qa?w_LBJb
z2B#{Om9pqLztqG3~$M;+_0n67KMi-rnKN2Z#+tVWTzU0&Ws<9y{tQixS&{)dZQ
zzO(f=>>pe#3W7N?Q1rHO4At1P=0tJw2T%g$0Xzy7)R@O|aC5Yu4yB9~+i)#mAPPFw
zV)|0Y7mLut|2&)-!+{I6dYJ;3mL=chhX*7FGIZ6osO}9DQy)eGO1v;x1G|5OSScwd
zvMyormj9rACCi4>L|q>it`Q)nP`H$pp8t`#dSGZCg5`=y!Q~|&XKVh(nKRJTSMS=*
zStzg1*aaEaadqpgXj%R-=>qyxYg9+!bT~`wDZ77T%2sV*T~UG}-8JE)SC*dfm%NW^
zV!h*V``BL*8#L`v)0^|E|I);zegjlt{Or4|UIHRxdT-@@-KNsp$ksdJkdB0`#$=0{
zxqxujHQH5sWf}PDmC(8NURRD7hYW90cp&EO5>Z~NHTVQ?<;hV6|FOl8Mr7;x5RR)@uZ@jhHm??
z6EOA6^rWHWYO++Qk{pRjj{4`HkikVpQ0lP9$DOo+M5f6Daq}X)&7h*BMInR-MsDis
zBBl+0*p?t8@0~K34>J#|{3)Q!uoEUg$M-SDk20XmTh2ptQDyi34`J~LZ=v$@>8e~D
zBexk~#7c+~hI&;RqcL~JpWgeY>A}>0^8(tY^ygTO_OI>E0vsb!Kchi2yvHtD#Nb7h
zMM(WHT$aI&n&&0n*(wB^>SpGPzC_R@&6c9VKYBn}pdxbGyGziG-cctwDr{F%Fv@>7
z!!B8|OHS
zF@iV^&dx?x=|!U4&!7w&8%tkg&>$vq?(R{GKaB8U4)6(}ig|kMC;>TU!%A-=JQn2_
zA4J$ne#2C-*Mh%SOE9(40$~$KJs>o?35MvBoL#>XDMWEIiWWtNFLjaJ%&Y{G{Xp-*
zYx^Ie+75fSNs4)+eS&99?xnhMa7f*uRe|K8sBhnEuRaMSWVf&k6rVqmNKf(=kkO9&
zEKOZ46B92004ret005`~pR#I0zW@LO008dj4VQnaZD29>Y4&>)7PNI*|8XS|BmiT|
z-MC-^A3QUUeG$SOE$5@QOO2AJqIM2I)T-_q7|xAtra-
zye!Dl!#5nTzgX)Pa+w()o<5to$N&HX02(j=00SREo3}~f4<=Ir9smBRmH+?)00D3K
z`O*u;c~LwnJzcPKTYWs(VSuPSk(M*sF`)4A_q4g0*`Yu{2u$$@or(W*rd~Bh-3G5^
zlbnvmeiDRe8mTJj9a%tuAvBc*-GZ1Iz=n?1A5BpVh>Ov!#SE}_B*k;aCi$E|hC9!1
z8CRNs7ajr@4N?g(!QKjL-jOpuUzn;QZGc{vqwzG}!(az=pPbHZMZQCS;f=k?{!rxT
z_F+ocm2SEe`~xDKnx&HAwD_|7o~V?rn7beq+A@KSC^$G<)a)toA)6KWwaOw8~UrXV?hnXI1LI|0P>7Nmll#D3iK~ka34>8$K2i7gCU^
zQc#|Hiv@gDf+;jZfa6(+&>N)EWm(|yKu2J^n&vgK{@`{X8lgN4T}QeJxsPYT4a@!j
z$L3+fIsUb&^izZIwXS@+8~Lb2_&GpCr^pD;yM36B&+=hAkP}{mE`tMMEGS8Q9`SKV
zrzW+Ou=UZ)6MjEh*9KU;vv?!-XJ=s(8MeP39Uif31agQ@13%Qti>{~Pkm*uEmFVl|
z(KfslOiN2DQJWX@Db|D_6YB9{p0l%95ToD?fMl^s1INrkvWIfw?H9w=dg9y4X4bgR
z50Sqduc&DV6%(ZOujCd06B+AXrPXd9oA$BS&IM1$xsNO~@7`m|ZOAazZDpebg7E-0
z9KZZ+A>V?kBVuji#Y;hjLCoiBq=#rbkW!900%d|h_q_JH3y#STvCx7Ee5f`k9UUeI
z)Gz9Vn+*}_L2MG%zXk7me#=xOHHipLj#Bhhgo@viSoo0KdL$@V=w+GpDN@}~(S0ci
zJ^%n!H5;Ctnr^|RdK-Ndj8$=z*WfbRxhMX&l2-||p`!@A)~lpIn+Lc$000933P=C|
z0Lek0)kP6JKmPy#0{{Si@Pz#a%Xy%E(RI{PpSYmsKHH=3>glaS}bQ4ymjy?9)<|Qu-i~`2Z5z>HA~{6K*7wn
z!FA=7pp!WO^;)$t$0gby+wNilzhEr_Zz}a9u3V3A6{@uH?_$B&AIFLbx((Tq#dKL)
zH#&debd0K7w;p-Ul>F~ppLf=JyEPXnq?Mq^NlYr2OWWqLi3Xhcpa1{^05Bl{006)N
zpY(J?zW@LO006fSF^rAX;buqx{*J5sm#vN=0pl$mEBP$XPdoqs0|QW}&rh?_N(&LU
zMSeD8J6}NmfSCE;UK}5gm6q3=>wr?y?pe^BRh6ac`N$pEF97d)iE6D+?L{al4}_jG
z&!;S+%CVA8al-aoH}C;bkBc+?C|bqRlVd8n({@VCeAAUamgMAd3-AgtypHJdF^_lm
zI`oo3eg4&8Jw6MNveEc==7GwM<$z`ZPA*aFhB|-%00rCt00311pZ01)zW@LO004+N
zCdeb=biAglDaXBZk^le$003vfk2&b|
literal 0
HcmV?d00001
diff --git a/collaborative-glossary-acronym-guard/reports/manifest.json b/collaborative-glossary-acronym-guard/reports/manifest.json
new file mode 100644
index 00000000..902e7a39
--- /dev/null
+++ b/collaborative-glossary-acronym-guard/reports/manifest.json
@@ -0,0 +1,26 @@
+{
+ "module": "collaborative-glossary-acronym-guard",
+ "issue": 12,
+ "generatedAt": "2026-06-01T10:00:00.000Z",
+ "scenarios": [
+ {
+ "name": "clean",
+ "status": "READY",
+ "fingerprint": "08b581cfd1de1ccc",
+ "findings": 0
+ },
+ {
+ "name": "risky",
+ "status": "HOLD",
+ "fingerprint": "2f92e5168084871a",
+ "findings": 15
+ }
+ ],
+ "artifacts": [
+ "reports/clean-audit.json",
+ "reports/risky-audit.json",
+ "reports/risky-review.md",
+ "reports/summary.svg",
+ "reports/demo.mp4"
+ ]
+}
diff --git a/collaborative-glossary-acronym-guard/reports/risky-audit.json b/collaborative-glossary-acronym-guard/reports/risky-audit.json
new file mode 100644
index 00000000..fed5fae1
--- /dev/null
+++ b/collaborative-glossary-acronym-guard/reports/risky-audit.json
@@ -0,0 +1,243 @@
+{
+ "generatedAt": "2026-06-01T10:00:00.000Z",
+ "status": "HOLD",
+ "summary": "Glossary export is hold with 2 critical, 12 high, and 1 warning finding(s).",
+ "findingCounts": {
+ "critical": 2,
+ "high": 12,
+ "warning": 1
+ },
+ "findings": [
+ {
+ "code": "ACRONYM_EXPANSION_COLLISION",
+ "severity": "critical",
+ "message": "SNR has multiple approved expansions: signal-to-noise ratio; single nucleus rna.",
+ "impact": "Readers and downstream exports cannot know which definition applies in each section.",
+ "path": "glossaryEntries.SNR",
+ "remediation": "Split the acronym by discipline or choose one canonical manuscript-level expansion.",
+ "owner": "lead editor"
+ },
+ {
+ "code": "PRIVATE_TERMINOLOGY_NOTE_LEAK",
+ "severity": "critical",
+ "message": "Glossary entry \"SNR\" would leak private reviewer or collaborator terminology notes.",
+ "impact": "Anonymous review notes, local paths, and private comments must not appear in manuscript exports.",
+ "path": "glossaryEntries[1].exportNote",
+ "remediation": "Redact private terminology notes and export only public glossary text.",
+ "owner": "export owner"
+ },
+ {
+ "code": "ACRONYM_FIRST_USE_UNEXPANDED",
+ "severity": "high",
+ "message": "CRISPR first appears in section intro without its expansion.",
+ "impact": "Publication exports should define acronyms at first use for readers and reviewers.",
+ "path": "sections.intro",
+ "remediation": "Introduce \"Clustered Regularly Interspaced Short Palindromic Repeats (CRISPR)\" at first use or move the first mention after the definition.",
+ "owner": "section author"
+ },
+ {
+ "code": "ACRONYM_FIRST_USE_UNEXPANDED",
+ "severity": "high",
+ "message": "SNR first appears in section methods without its expansion.",
+ "impact": "Publication exports should define acronyms at first use for readers and reviewers.",
+ "path": "sections.methods",
+ "remediation": "Introduce \"Signal-to-noise ratio (SNR)\" at first use or move the first mention after the definition.",
+ "owner": "section author"
+ },
+ {
+ "code": "ACRONYM_FIRST_USE_UNEXPANDED",
+ "severity": "high",
+ "message": "SNR first appears in section methods without its expansion.",
+ "impact": "Publication exports should define acronyms at first use for readers and reviewers.",
+ "path": "sections.methods",
+ "remediation": "Introduce \"Single nucleus RNA (SNR)\" at first use or move the first mention after the definition.",
+ "owner": "section author"
+ },
+ {
+ "code": "BLOCKING_TERMINOLOGY_COMMENT",
+ "severity": "high",
+ "message": "Unresolved terminology comment blocks export for batch effect.",
+ "impact": "The collaborative editor should not publish terminology while blocking review threads are open.",
+ "path": "comments[0]",
+ "remediation": "Resolve the terminology comment or mark it non-blocking before export.",
+ "owner": "review owner"
+ },
+ {
+ "code": "GLOSSARY_EXPORT_INCOMPLETE",
+ "severity": "high",
+ "message": "Exportable glossary entry \"SNR\" is missing from the export glossary manifest.",
+ "impact": "Readers will see terminology in the manuscript without a matching glossary definition.",
+ "path": "glossaryEntries[2].exportable",
+ "remediation": "Add the entry id to export.includeGlossaryIds or mark it as internal-only.",
+ "owner": "export owner"
+ },
+ {
+ "code": "GLOSSARY_EXPORT_INCOMPLETE",
+ "severity": "high",
+ "message": "Exportable glossary entry \"batch effect\" is missing from the export glossary manifest.",
+ "impact": "Readers will see terminology in the manuscript without a matching glossary definition.",
+ "path": "glossaryEntries[3].exportable",
+ "remediation": "Add the entry id to export.includeGlossaryIds or mark it as internal-only.",
+ "owner": "export owner"
+ },
+ {
+ "code": "LOCKED_SECTION_TERM_EDIT_UNAPPROVED",
+ "severity": "high",
+ "message": "Terminology edit edit-locked-snr targets locked section methods without current approval.",
+ "impact": "Locked final-review sections should not accept glossary changes without explicit approval.",
+ "path": "proposedEdits[0]",
+ "remediation": "Obtain approval for SNR against section version methods-v8.",
+ "owner": "section owner"
+ },
+ {
+ "code": "MENTIONED_TERM_NOT_EXPORTED",
+ "severity": "high",
+ "message": "\"SNR\" appears in section methods but is absent from the exported glossary.",
+ "impact": "Collaborators can accidentally remove a needed term from the reader-facing glossary.",
+ "path": "sections.methods",
+ "remediation": "Include the mentioned term in the export glossary or remove the stale manuscript mention.",
+ "owner": "export owner"
+ },
+ {
+ "code": "MENTIONED_TERM_NOT_EXPORTED",
+ "severity": "high",
+ "message": "\"batch effect\" appears in section intro but is absent from the exported glossary.",
+ "impact": "Collaborators can accidentally remove a needed term from the reader-facing glossary.",
+ "path": "sections.intro",
+ "remediation": "Include the mentioned term in the export glossary or remove the stale manuscript mention.",
+ "owner": "export owner"
+ },
+ {
+ "code": "TERM_DEFINITION_INCOMPLETE",
+ "severity": "high",
+ "message": "Glossary entry \"SNR\" has an incomplete definition.",
+ "impact": "Short or missing definitions create discipline-specific ambiguity during review.",
+ "path": "glossaryEntries[1].definition",
+ "remediation": "Add a concise, reviewer-ready definition with enough scientific context.",
+ "owner": "terminology editor"
+ },
+ {
+ "code": "TERM_DEFINITION_INCOMPLETE",
+ "severity": "high",
+ "message": "Glossary entry \"batch effect\" has an incomplete definition.",
+ "impact": "Short or missing definitions create discipline-specific ambiguity during review.",
+ "path": "glossaryEntries[3].definition",
+ "remediation": "Add a concise, reviewer-ready definition with enough scientific context.",
+ "owner": "terminology editor"
+ },
+ {
+ "code": "UNAPPROVED_GLOSSARY_TERM",
+ "severity": "high",
+ "message": "Glossary entry \"SNR\" is exportable but not approved.",
+ "impact": "Collaborative manuscripts should not export provisional terminology.",
+ "path": "glossaryEntries[2].status",
+ "remediation": "Route the term through collaborator approval or hold it from export.",
+ "owner": "lead editor"
+ },
+ {
+ "code": "STALE_TERM_SECTION_ANCHOR",
+ "severity": "warning",
+ "message": "Glossary entry \"CRISPR\" was approved against an older version of section intro.",
+ "impact": "Collaborative edits may have changed the term context since approval.",
+ "path": "glossaryEntries[0].sectionVersionHash",
+ "remediation": "Refresh the term anchor against the current section version.",
+ "owner": "section author"
+ }
+ ],
+ "exportGlossary": [
+ {
+ "id": "term-crispr",
+ "term": "CRISPR",
+ "acronym": "CRISPR",
+ "expansion": "Clustered Regularly Interspaced Short Palindromic Repeats",
+ "definition": "Genome editing screen technology used by the manuscript collaborators.",
+ "discipline": "genomics"
+ },
+ {
+ "id": "term-snr-imaging",
+ "term": "SNR",
+ "acronym": "SNR",
+ "expansion": "Signal-to-noise ratio",
+ "definition": "Image metric.",
+ "discipline": "imaging"
+ }
+ ],
+ "remediationActions": [
+ {
+ "code": "ACRONYM_EXPANSION_COLLISION",
+ "owner": "lead editor",
+ "action": "Split the acronym by discipline or choose one canonical manuscript-level expansion."
+ },
+ {
+ "code": "PRIVATE_TERMINOLOGY_NOTE_LEAK",
+ "owner": "export owner",
+ "action": "Redact private terminology notes and export only public glossary text."
+ },
+ {
+ "code": "ACRONYM_FIRST_USE_UNEXPANDED",
+ "owner": "section author",
+ "action": "Introduce \"Clustered Regularly Interspaced Short Palindromic Repeats (CRISPR)\" at first use or move the first mention after the definition."
+ },
+ {
+ "code": "ACRONYM_FIRST_USE_UNEXPANDED",
+ "owner": "section author",
+ "action": "Introduce \"Signal-to-noise ratio (SNR)\" at first use or move the first mention after the definition."
+ },
+ {
+ "code": "ACRONYM_FIRST_USE_UNEXPANDED",
+ "owner": "section author",
+ "action": "Introduce \"Single nucleus RNA (SNR)\" at first use or move the first mention after the definition."
+ },
+ {
+ "code": "BLOCKING_TERMINOLOGY_COMMENT",
+ "owner": "review owner",
+ "action": "Resolve the terminology comment or mark it non-blocking before export."
+ },
+ {
+ "code": "GLOSSARY_EXPORT_INCOMPLETE",
+ "owner": "export owner",
+ "action": "Add the entry id to export.includeGlossaryIds or mark it as internal-only."
+ },
+ {
+ "code": "GLOSSARY_EXPORT_INCOMPLETE",
+ "owner": "export owner",
+ "action": "Add the entry id to export.includeGlossaryIds or mark it as internal-only."
+ },
+ {
+ "code": "LOCKED_SECTION_TERM_EDIT_UNAPPROVED",
+ "owner": "section owner",
+ "action": "Obtain approval for SNR against section version methods-v8."
+ },
+ {
+ "code": "MENTIONED_TERM_NOT_EXPORTED",
+ "owner": "export owner",
+ "action": "Include the mentioned term in the export glossary or remove the stale manuscript mention."
+ },
+ {
+ "code": "MENTIONED_TERM_NOT_EXPORTED",
+ "owner": "export owner",
+ "action": "Include the mentioned term in the export glossary or remove the stale manuscript mention."
+ },
+ {
+ "code": "TERM_DEFINITION_INCOMPLETE",
+ "owner": "terminology editor",
+ "action": "Add a concise, reviewer-ready definition with enough scientific context."
+ },
+ {
+ "code": "TERM_DEFINITION_INCOMPLETE",
+ "owner": "terminology editor",
+ "action": "Add a concise, reviewer-ready definition with enough scientific context."
+ },
+ {
+ "code": "UNAPPROVED_GLOSSARY_TERM",
+ "owner": "lead editor",
+ "action": "Route the term through collaborator approval or hold it from export."
+ },
+ {
+ "code": "STALE_TERM_SECTION_ANCHOR",
+ "owner": "section author",
+ "action": "Refresh the term anchor against the current section version."
+ }
+ ],
+ "fingerprint": "2f92e5168084871a"
+}
diff --git a/collaborative-glossary-acronym-guard/reports/risky-review.md b/collaborative-glossary-acronym-guard/reports/risky-review.md
new file mode 100644
index 00000000..262777a8
--- /dev/null
+++ b/collaborative-glossary-acronym-guard/reports/risky-review.md
@@ -0,0 +1,47 @@
+# Collaborative Glossary and Acronym Guard
+
+Document: Shared editor glossary draft
+Status: HOLD
+Fingerprint: 2f92e5168084871a
+
+## Summary
+
+Glossary export is hold with 2 critical, 12 high, and 1 warning finding(s).
+
+## Findings
+
+- CRITICAL ACRONYM_EXPANSION_COLLISION: SNR has multiple approved expansions: signal-to-noise ratio; single nucleus rna.
+ - Remediation: Split the acronym by discipline or choose one canonical manuscript-level expansion.
+- CRITICAL PRIVATE_TERMINOLOGY_NOTE_LEAK: Glossary entry "SNR" would leak private reviewer or collaborator terminology notes.
+ - Remediation: Redact private terminology notes and export only public glossary text.
+- HIGH ACRONYM_FIRST_USE_UNEXPANDED: CRISPR first appears in section intro without its expansion.
+ - Remediation: Introduce "Clustered Regularly Interspaced Short Palindromic Repeats (CRISPR)" at first use or move the first mention after the definition.
+- HIGH ACRONYM_FIRST_USE_UNEXPANDED: SNR first appears in section methods without its expansion.
+ - Remediation: Introduce "Signal-to-noise ratio (SNR)" at first use or move the first mention after the definition.
+- HIGH ACRONYM_FIRST_USE_UNEXPANDED: SNR first appears in section methods without its expansion.
+ - Remediation: Introduce "Single nucleus RNA (SNR)" at first use or move the first mention after the definition.
+- HIGH BLOCKING_TERMINOLOGY_COMMENT: Unresolved terminology comment blocks export for batch effect.
+ - Remediation: Resolve the terminology comment or mark it non-blocking before export.
+- HIGH GLOSSARY_EXPORT_INCOMPLETE: Exportable glossary entry "SNR" is missing from the export glossary manifest.
+ - Remediation: Add the entry id to export.includeGlossaryIds or mark it as internal-only.
+- HIGH GLOSSARY_EXPORT_INCOMPLETE: Exportable glossary entry "batch effect" is missing from the export glossary manifest.
+ - Remediation: Add the entry id to export.includeGlossaryIds or mark it as internal-only.
+- HIGH LOCKED_SECTION_TERM_EDIT_UNAPPROVED: Terminology edit edit-locked-snr targets locked section methods without current approval.
+ - Remediation: Obtain approval for SNR against section version methods-v8.
+- HIGH MENTIONED_TERM_NOT_EXPORTED: "SNR" appears in section methods but is absent from the exported glossary.
+ - Remediation: Include the mentioned term in the export glossary or remove the stale manuscript mention.
+- HIGH MENTIONED_TERM_NOT_EXPORTED: "batch effect" appears in section intro but is absent from the exported glossary.
+ - Remediation: Include the mentioned term in the export glossary or remove the stale manuscript mention.
+- HIGH TERM_DEFINITION_INCOMPLETE: Glossary entry "SNR" has an incomplete definition.
+ - Remediation: Add a concise, reviewer-ready definition with enough scientific context.
+- HIGH TERM_DEFINITION_INCOMPLETE: Glossary entry "batch effect" has an incomplete definition.
+ - Remediation: Add a concise, reviewer-ready definition with enough scientific context.
+- HIGH UNAPPROVED_GLOSSARY_TERM: Glossary entry "SNR" is exportable but not approved.
+ - Remediation: Route the term through collaborator approval or hold it from export.
+- WARNING STALE_TERM_SECTION_ANCHOR: Glossary entry "CRISPR" was approved against an older version of section intro.
+ - Remediation: Refresh the term anchor against the current section version.
+
+## Export Glossary
+
+- CRISPR - Clustered Regularly Interspaced Short Palindromic Repeats: Genome editing screen technology used by the manuscript collaborators.
+- SNR - Signal-to-noise ratio: Image metric.
diff --git a/collaborative-glossary-acronym-guard/reports/summary.svg b/collaborative-glossary-acronym-guard/reports/summary.svg
new file mode 100644
index 00000000..a2aa781c
--- /dev/null
+++ b/collaborative-glossary-acronym-guard/reports/summary.svg
@@ -0,0 +1,13 @@
+
\ No newline at end of file
diff --git a/collaborative-glossary-acronym-guard/sample-data.js b/collaborative-glossary-acronym-guard/sample-data.js
new file mode 100644
index 00000000..3e149c68
--- /dev/null
+++ b/collaborative-glossary-acronym-guard/sample-data.js
@@ -0,0 +1,183 @@
+"use strict";
+
+const cleanPacket = {
+ document: {
+ id: "doc-collab-glossary-clean",
+ title: "Collaborative manuscript terminology export",
+ versionHash: "doc-v7-clean"
+ },
+ sections: [
+ {
+ id: "intro",
+ title: "Introduction",
+ versionHash: "intro-v3",
+ locked: false,
+ body:
+ "Clustered Regularly Interspaced Short Palindromic Repeats (CRISPR) screens require a shared terminology layer before collaborator export."
+ },
+ {
+ id: "methods",
+ title: "Methods",
+ versionHash: "methods-v5",
+ locked: true,
+ body:
+ "Signal-to-noise ratio (SNR), batch effect, and unique molecular identifier usage are defined before review."
+ }
+ ],
+ glossaryEntries: [
+ {
+ id: "term-crispr",
+ term: "CRISPR",
+ acronym: "CRISPR",
+ expansion: "Clustered Regularly Interspaced Short Palindromic Repeats",
+ definition: "Genome-editing screen technology used to perturb target genes in pooled experiments.",
+ discipline: "genomics",
+ firstUseSectionId: "intro",
+ sectionVersionHash: "intro-v3",
+ status: "approved",
+ exportable: true,
+ exportNote: "Public glossary definition."
+ },
+ {
+ id: "term-snr",
+ term: "SNR",
+ acronym: "SNR",
+ expansion: "Signal-to-noise ratio",
+ definition: "Quantitative ratio comparing measured signal strength against background measurement noise.",
+ discipline: "imaging",
+ firstUseSectionId: "methods",
+ sectionVersionHash: "methods-v5",
+ status: "approved",
+ exportable: true
+ },
+ {
+ id: "term-batch-effect",
+ term: "batch effect",
+ definition: "Systematic measurement variation introduced by processing samples in different experimental batches.",
+ discipline: "statistics",
+ firstUseSectionId: "methods",
+ sectionVersionHash: "methods-v5",
+ status: "approved",
+ exportable: true
+ }
+ ],
+ proposedEdits: [
+ {
+ id: "edit-approved-batch-definition",
+ termId: "term-batch-effect",
+ sectionId: "methods",
+ sectionVersionHash: "methods-v5",
+ approvedBy: ["lead-author", "stats-reviewer"]
+ }
+ ],
+ comments: [],
+ export: {
+ format: "journal-manuscript",
+ includeGlossaryIds: ["term-crispr", "term-snr", "term-batch-effect"],
+ includePrivateNotes: false
+ }
+};
+
+const riskyPacket = {
+ document: {
+ id: "doc-collab-glossary-risky",
+ title: "Shared editor glossary draft",
+ versionHash: "doc-v11-risky"
+ },
+ sections: [
+ {
+ id: "intro",
+ title: "Introduction",
+ versionHash: "intro-v9",
+ locked: false,
+ body:
+ "CRISPR screens and batch effect corrections were discussed in the shared editor before terminology approval."
+ },
+ {
+ id: "methods",
+ title: "Methods",
+ versionHash: "methods-v8",
+ locked: true,
+ body:
+ "SNR was computed for microscopy while SNR was also used by another collaborator to mean single nucleus RNA."
+ }
+ ],
+ glossaryEntries: [
+ {
+ id: "term-crispr",
+ term: "CRISPR",
+ acronym: "CRISPR",
+ expansion: "Clustered Regularly Interspaced Short Palindromic Repeats",
+ definition: "Genome editing screen technology used by the manuscript collaborators.",
+ discipline: "genomics",
+ firstUseSectionId: "intro",
+ sectionVersionHash: "intro-v7",
+ status: "approved",
+ exportable: true
+ },
+ {
+ id: "term-snr-imaging",
+ term: "SNR",
+ acronym: "SNR",
+ expansion: "Signal-to-noise ratio",
+ definition: "Image metric.",
+ discipline: "imaging",
+ firstUseSectionId: "methods",
+ sectionVersionHash: "methods-v8",
+ status: "approved",
+ exportable: true,
+ privateNote: "Reviewer-only note from anonymous reviewer A: do not export."
+ },
+ {
+ id: "term-snr-rna",
+ term: "SNR",
+ acronym: "SNR",
+ expansion: "Single nucleus RNA",
+ definition: "Sequencing context acronym for single nucleus RNA analysis in draft notes.",
+ discipline: "transcriptomics",
+ firstUseSectionId: "methods",
+ sectionVersionHash: "methods-v8",
+ status: "draft",
+ exportable: true
+ },
+ {
+ id: "term-batch-effect",
+ term: "batch effect",
+ definition: "Batch bias.",
+ discipline: "statistics",
+ firstUseSectionId: "intro",
+ sectionVersionHash: "intro-v9",
+ status: "approved",
+ exportable: true,
+ exportNote: "Public note accidentally includes /Users/reviewer/private terminology draft."
+ }
+ ],
+ proposedEdits: [
+ {
+ id: "edit-locked-snr",
+ termId: "term-snr-imaging",
+ sectionId: "methods",
+ sectionVersionHash: "methods-v7",
+ approvedBy: []
+ }
+ ],
+ comments: [
+ {
+ id: "comment-term-batch-effect",
+ termId: "term-batch-effect",
+ resolved: false,
+ blocksExport: true,
+ body: "Statistics reviewer asked for a clearer discipline-specific definition."
+ }
+ ],
+ export: {
+ format: "journal-manuscript",
+ includeGlossaryIds: ["term-crispr", "term-snr-imaging"],
+ includePrivateNotes: true
+ }
+};
+
+module.exports = {
+ cleanPacket,
+ riskyPacket
+};
diff --git a/collaborative-glossary-acronym-guard/test.js b/collaborative-glossary-acronym-guard/test.js
new file mode 100644
index 00000000..49c2b2f6
--- /dev/null
+++ b/collaborative-glossary-acronym-guard/test.js
@@ -0,0 +1,44 @@
+"use strict";
+
+const assert = require("node:assert/strict");
+const {
+ evaluateGlossaryAcronymPacket,
+ renderMarkdownReport,
+ renderSvgSummary
+} = require("./index");
+const { cleanPacket, riskyPacket } = require("./sample-data");
+
+const clean = evaluateGlossaryAcronymPacket(cleanPacket, { now: "2026-06-01T10:00:00.000Z" });
+assert.equal(clean.status, "READY");
+assert.equal(clean.findings.length, 0);
+assert.equal(clean.exportGlossary.length, 3);
+
+const risky = evaluateGlossaryAcronymPacket(riskyPacket, { now: "2026-06-01T10:00:00.000Z" });
+const riskyCodes = new Set(risky.findings.map((finding) => finding.code));
+assert.equal(risky.status, "HOLD");
+assert.ok(riskyCodes.has("ACRONYM_EXPANSION_COLLISION"));
+assert.ok(riskyCodes.has("ACRONYM_FIRST_USE_UNEXPANDED"));
+assert.ok(riskyCodes.has("PRIVATE_TERMINOLOGY_NOTE_LEAK"));
+assert.ok(riskyCodes.has("LOCKED_SECTION_TERM_EDIT_UNAPPROVED"));
+assert.ok(riskyCodes.has("GLOSSARY_EXPORT_INCOMPLETE"));
+assert.ok(riskyCodes.has("TERM_DEFINITION_INCOMPLETE"));
+assert.ok(riskyCodes.has("UNAPPROVED_GLOSSARY_TERM"));
+assert.ok(riskyCodes.has("BLOCKING_TERMINOLOGY_COMMENT"));
+assert.ok(riskyCodes.has("STALE_TERM_SECTION_ANCHOR"));
+
+const repeatedRisky = evaluateGlossaryAcronymPacket(riskyPacket, { now: "2026-06-01T10:05:00.000Z" });
+assert.equal(risky.fingerprint, repeatedRisky.fingerprint);
+
+const markdown = renderMarkdownReport(risky, riskyPacket);
+assert.match(markdown, /Collaborative Glossary and Acronym Guard/);
+assert.match(markdown, /ACRONYM_EXPANSION_COLLISION/);
+assert.match(markdown, /Export Glossary/);
+
+const svg = renderSvgSummary(risky);
+assert.match(svg, /