From bbfb9ebd77e466dea649d1e9a113c8f5bf302514 Mon Sep 17 00:00:00 2001 From: Jorel97 Date: Mon, 1 Jun 2026 10:08:26 -0600 Subject: [PATCH] Add protocol deviation graph guard --- protocol-deviation-graph-guard/README.md | 24 ++ protocol-deviation-graph-guard/demo.js | 26 ++ protocol-deviation-graph-guard/demo_video.py | 46 +++ protocol-deviation-graph-guard/index.js | 298 ++++++++++++++++++ protocol-deviation-graph-guard/package.json | 12 + .../reports/demo-script.txt | 12 + .../reports/demo.gif | Bin 0 -> 54675 bytes .../reports/demo.mp4 | Bin 0 -> 40017 bytes .../reports/protocol-deviation-report.json | 119 +++++++ .../reports/protocol-deviation-report.md | 38 +++ .../reports/summary.svg | 15 + .../requirements-map.md | 13 + protocol-deviation-graph-guard/sample-data.js | 106 +++++++ protocol-deviation-graph-guard/test.js | 55 ++++ 14 files changed, 764 insertions(+) create mode 100644 protocol-deviation-graph-guard/README.md create mode 100644 protocol-deviation-graph-guard/demo.js create mode 100644 protocol-deviation-graph-guard/demo_video.py create mode 100644 protocol-deviation-graph-guard/index.js create mode 100644 protocol-deviation-graph-guard/package.json create mode 100644 protocol-deviation-graph-guard/reports/demo-script.txt create mode 100644 protocol-deviation-graph-guard/reports/demo.gif create mode 100644 protocol-deviation-graph-guard/reports/demo.mp4 create mode 100644 protocol-deviation-graph-guard/reports/protocol-deviation-report.json create mode 100644 protocol-deviation-graph-guard/reports/protocol-deviation-report.md create mode 100644 protocol-deviation-graph-guard/reports/summary.svg create mode 100644 protocol-deviation-graph-guard/requirements-map.md create mode 100644 protocol-deviation-graph-guard/sample-data.js create mode 100644 protocol-deviation-graph-guard/test.js diff --git a/protocol-deviation-graph-guard/README.md b/protocol-deviation-graph-guard/README.md new file mode 100644 index 00000000..b90b9755 --- /dev/null +++ b/protocol-deviation-graph-guard/README.md @@ -0,0 +1,24 @@ +# Protocol Deviation Graph Guard + +Synthetic, dependency-free review module for SCIBASE issue #17, focused on experiment-to-protocol adherence before knowledge graph edges and recommendations are published. + +The guard audits protocol packets for: + +- missing required protocol steps; +- protocol version mismatches; +- unauthorized reagent lots; +- expired instrument calibration; +- parameter deviations outside declared tolerances; +- graph edge publish/review/hold decisions. + +It emits JSON, Markdown, SVG, GIF, and MP4 reviewer artifacts from synthetic data only. No credentials, private studies, live graph services, payment systems, or external APIs are used. + +## Commands + +```bash +npm test +npm run demo +npm run demo:video +``` + +Generated artifacts are written to `reports/`. diff --git a/protocol-deviation-graph-guard/demo.js b/protocol-deviation-graph-guard/demo.js new file mode 100644 index 00000000..a5e7caad --- /dev/null +++ b/protocol-deviation-graph-guard/demo.js @@ -0,0 +1,26 @@ +const path = require("path"); +const { samplePacket } = require("./sample-data"); +const { auditProtocolDeviationGraph, writeReportArtifacts } = require("./index"); + +const outputDir = path.join(__dirname, "reports"); +const report = auditProtocolDeviationGraph(samplePacket); +const artifacts = writeReportArtifacts(report, outputDir); + +const demoScript = [ + "Protocol Deviation Graph Guard demo", + "", + "1. Load synthetic protocol and experiment graph packets.", + "2. Compare observed experiment steps against required protocol steps and tolerances.", + "3. Check protocol version, reagent lot, and instrument calibration evidence.", + "4. Hold unsafe experiment-to-protocol and recommendation edges before publication.", + "", + `Decision: ${report.decision}`, + `Held edges: ${report.totals.holdEdges}`, + `Publishable edges: ${report.totals.publishEdges}`, + "", + "Synthetic data only. No private studies, credentials, live graph services, or external APIs." +].join("\n"); + +require("fs").writeFileSync(path.join(outputDir, "demo-script.txt"), `${demoScript}\n`); + +console.log(JSON.stringify({ report: artifacts, decision: report.decision, totals: report.totals }, null, 2)); diff --git a/protocol-deviation-graph-guard/demo_video.py b/protocol-deviation-graph-guard/demo_video.py new file mode 100644 index 00000000..f046a6a5 --- /dev/null +++ b/protocol-deviation-graph-guard/demo_video.py @@ -0,0 +1,46 @@ +from pathlib import Path + +import imageio.v3 as iio +import numpy as np +from PIL import Image, ImageDraw, ImageFont + + +ROOT = Path(__file__).resolve().parent +REPORTS = ROOT / "reports" +REPORTS.mkdir(exist_ok=True) + + +def font(size): + for name in ("arial.ttf", "segoeui.ttf"): + try: + return ImageFont.truetype(name, size) + except OSError: + pass + return ImageFont.load_default() + + +slides = [ + ("Protocol Deviation Graph Guard", "Synthetic graph safety control for SCIBASE #17"), + ("Input", "protocol steps + experiment evidence + proposed graph edges"), + ("Findings", "missing sequencing QC + expired calibration + lot mismatch"), + ("Decision", "hold unsafe graph edges before recommendations publish"), +] + +frames = [] +for title, subtitle in slides: + image = Image.new("RGB", (960, 544), "#102033") + draw = ImageDraw.Draw(image) + draw.rectangle((48, 58, 912, 486), outline="#38bdf8", width=3) + draw.text((82, 132), title, fill="#f8fafc", font=font(40)) + draw.text((82, 214), subtitle, fill="#dbeafe", font=font(24)) + draw.rectangle((82, 342, 742, 392), fill="#dc2626") + draw.text((102, 354), "recommendation edges held", fill="#fee2e2", font=font(24)) + draw.text((82, 430), "Synthetic data only. No private studies or live graph APIs.", fill="#cbd5e1", font=font(20)) + frames.extend([image] * 14) + +gif_path = REPORTS / "demo.gif" +mp4_path = REPORTS / "demo.mp4" +frames[0].save(gif_path, save_all=True, append_images=frames[1:], duration=120, loop=0) +iio.imwrite(mp4_path, [np.asarray(frame) for frame in frames], fps=8, codec="libx264") +print(f"wrote {gif_path}") +print(f"wrote {mp4_path}") diff --git a/protocol-deviation-graph-guard/index.js b/protocol-deviation-graph-guard/index.js new file mode 100644 index 00000000..5b1072c1 --- /dev/null +++ b/protocol-deviation-graph-guard/index.js @@ -0,0 +1,298 @@ +const fs = require("fs"); +const path = require("path"); + +const SEVERITY_POINTS = { + info: 5, + medium: 20, + high: 35, + critical: 55 +}; + +function asArray(value, field) { + if (!Array.isArray(value)) { + throw new TypeError(`${field} must be an array`); + } + return value; +} + +function asNonEmptyString(value, field) { + if (typeof value !== "string" || value.trim() === "") { + throw new TypeError(`${field} must be a non-empty string`); + } + return value.trim(); +} + +function daysBetween(firstDate, secondDate) { + const first = new Date(`${firstDate}T00:00:00.000Z`); + const second = new Date(`${secondDate}T00:00:00.000Z`); + return Math.round((second.getTime() - first.getTime()) / 86400000); +} + +function indexById(items, field) { + const map = new Map(); + for (const item of asArray(items, field)) { + map.set(asNonEmptyString(item.id, `${field}.id`), item); + } + return map; +} + +function compareParameters(protocolStep, observedStep, experiment) { + const findings = []; + const expectedParams = protocolStep.parameters || {}; + const observedParams = observedStep.observed || {}; + + for (const [name, rule] of Object.entries(expectedParams)) { + const observed = observedParams[name]; + if (typeof observed !== "number") { + findings.push({ + severity: "high", + code: "missing-parameter", + experimentId: experiment.id, + stepId: protocolStep.id, + message: `${name} was not recorded for ${protocolStep.label}` + }); + continue; + } + + const delta = Math.abs(observed - rule.expected); + if (delta > rule.tolerance) { + findings.push({ + severity: delta > rule.tolerance * 2 ? "critical" : "high", + code: "parameter-out-of-tolerance", + experimentId: experiment.id, + stepId: protocolStep.id, + message: `${name}=${observed} deviates from ${rule.expected} by ${delta}, tolerance ${rule.tolerance}` + }); + } + } + + return findings; +} + +function auditExperiment(protocol, experiment) { + const findings = []; + const observedSteps = indexById(experiment.steps || [], `${experiment.id}.steps`); + + if (experiment.protocolVersion !== protocol.version) { + findings.push({ + severity: "high", + code: "protocol-version-mismatch", + experimentId: experiment.id, + message: `experiment used ${experiment.protocolVersion}, current protocol is ${protocol.version}` + }); + } + + const calibrationDriftDays = daysBetween(protocol.calibrationValidUntil, experiment.performedAt); + if (calibrationDriftDays > 0) { + findings.push({ + severity: calibrationDriftDays > 14 ? "critical" : "high", + code: "instrument-calibration-expired", + experimentId: experiment.id, + message: `${experiment.instrumentId} calibration expired ${calibrationDriftDays} days before run` + }); + } + + const allowedLots = new Set(protocol.allowedReagentLots || []); + for (const lot of experiment.reagentLots || []) { + if (!allowedLots.has(lot)) { + findings.push({ + severity: "high", + code: "unauthorized-reagent-lot", + experimentId: experiment.id, + message: `${lot} is not approved for ${protocol.id}` + }); + } + } + + for (const step of protocol.requiredSteps || []) { + const observed = observedSteps.get(step.id); + if (step.required && !observed) { + findings.push({ + severity: "critical", + code: "missing-required-step", + experimentId: experiment.id, + stepId: step.id, + message: `${step.label} was not observed` + }); + continue; + } + + if (observed) { + findings.push(...compareParameters(step, observed, experiment)); + } + } + + return findings; +} + +function scoreFindings(findings) { + return Math.min( + 100, + findings.reduce((total, finding) => total + SEVERITY_POINTS[finding.severity], 0) + ); +} + +function buildEdgeActions(experiment, findings) { + const riskScore = scoreFindings(findings); + const action = + findings.some((finding) => finding.severity === "critical") || riskScore >= 70 + ? "hold" + : riskScore >= 35 + ? "review" + : "publish"; + + return (experiment.proposedEdges || []).map((edge) => ({ + ...edge, + action, + riskScore, + reason: + action === "publish" + ? "protocol adherence evidence is sufficient" + : "protocol deviation evidence must be resolved before graph publication" + })); +} + +function auditProtocolDeviationGraph(packet) { + const protocols = indexById(packet.protocols || [], "protocols"); + const experiments = asArray(packet.experiments || [], "experiments"); + + const experimentReports = experiments.map((experiment) => { + const protocol = protocols.get(asNonEmptyString(experiment.protocolId, "experiment.protocolId")); + if (!protocol) { + const findings = [ + { + severity: "critical", + code: "unknown-protocol", + experimentId: experiment.id, + message: `protocol ${experiment.protocolId} is not registered` + } + ]; + return { + experimentId: experiment.id, + protocolId: experiment.protocolId, + riskScore: scoreFindings(findings), + decision: "hold", + findings, + edgeActions: buildEdgeActions(experiment, findings) + }; + } + + const findings = auditExperiment(protocol, experiment); + const riskScore = scoreFindings(findings); + const edgeActions = buildEdgeActions(experiment, findings); + const decision = edgeActions.some((edge) => edge.action === "hold") + ? "hold" + : edgeActions.some((edge) => edge.action === "review") + ? "review" + : "publish"; + + return { + experimentId: experiment.id, + protocolId: protocol.id, + riskScore, + decision, + findings, + edgeActions + }; + }); + + const totals = experimentReports.reduce( + (acc, report) => { + acc.experiments += 1; + acc.findings += report.findings.length; + acc.holdEdges += report.edgeActions.filter((edge) => edge.action === "hold").length; + acc.reviewEdges += report.edgeActions.filter((edge) => edge.action === "review").length; + acc.publishEdges += report.edgeActions.filter((edge) => edge.action === "publish").length; + return acc; + }, + { experiments: 0, findings: 0, holdEdges: 0, reviewEdges: 0, publishEdges: 0 } + ); + + return { + generatedAt: packet.generatedAt || new Date().toISOString(), + module: "protocol-deviation-graph-guard", + decision: totals.holdEdges > 0 ? "hold-unsafe-graph-edges" : "publish-safe-graph-edges", + totals, + experimentReports + }; +} + +function renderMarkdown(report) { + const lines = [ + "# Protocol Deviation Graph Guard Report", + "", + `Generated: ${report.generatedAt}`, + `Decision: ${report.decision}`, + "", + "## Totals", + "", + `- Experiments audited: ${report.totals.experiments}`, + `- Findings: ${report.totals.findings}`, + `- Hold edges: ${report.totals.holdEdges}`, + `- Review edges: ${report.totals.reviewEdges}`, + `- Publish edges: ${report.totals.publishEdges}`, + "", + "## Experiment Decisions", + "" + ]; + + for (const experiment of report.experimentReports) { + lines.push(`### ${experiment.experimentId}`); + lines.push(""); + lines.push(`- Protocol: ${experiment.protocolId}`); + lines.push(`- Risk score: ${experiment.riskScore}`); + lines.push(`- Decision: ${experiment.decision}`); + lines.push(`- Edge actions: ${experiment.edgeActions.map((edge) => `${edge.type}:${edge.action}`).join(", ")}`); + if (experiment.findings.length === 0) { + lines.push("- Findings: none"); + } else { + for (const finding of experiment.findings) { + lines.push(`- [${finding.severity}] ${finding.code}: ${finding.message}`); + } + } + lines.push(""); + } + + lines.push("Synthetic data only. No private research data, payment systems, live graph services, or external APIs are used."); + return `${lines.join("\n")}\n`; +} + +function renderSvg(report) { + const safe = report.totals.publishEdges; + const held = report.totals.holdEdges; + const findings = report.totals.findings; + return ` + + Protocol Deviation Graph Guard + Recommendation-safe graph publication control for SCIBASE #17 + + ${safe} + publishable edges + + ${held} + held graph edges + + ${findings} + protocol findings + Synthetic reviewer artifact. No live graph, credentials, private studies, or external APIs. + +`; +} + +function writeReportArtifacts(report, outputDir) { + fs.mkdirSync(outputDir, { recursive: true }); + const jsonPath = path.join(outputDir, "protocol-deviation-report.json"); + const markdownPath = path.join(outputDir, "protocol-deviation-report.md"); + const svgPath = path.join(outputDir, "summary.svg"); + fs.writeFileSync(jsonPath, `${JSON.stringify(report, null, 2)}\n`); + fs.writeFileSync(markdownPath, renderMarkdown(report)); + fs.writeFileSync(svgPath, renderSvg(report)); + return { jsonPath, markdownPath, svgPath }; +} + +module.exports = { + auditProtocolDeviationGraph, + renderMarkdown, + renderSvg, + writeReportArtifacts +}; diff --git a/protocol-deviation-graph-guard/package.json b/protocol-deviation-graph-guard/package.json new file mode 100644 index 00000000..7678a9fe --- /dev/null +++ b/protocol-deviation-graph-guard/package.json @@ -0,0 +1,12 @@ +{ + "name": "protocol-deviation-graph-guard", + "version": "1.0.0", + "private": true, + "description": "Synthetic protocol deviation guard for SCIBASE scientific knowledge graph edges.", + "main": "index.js", + "scripts": { + "test": "node test.js", + "demo": "node demo.js", + "demo:video": "python demo_video.py" + } +} diff --git a/protocol-deviation-graph-guard/reports/demo-script.txt b/protocol-deviation-graph-guard/reports/demo-script.txt new file mode 100644 index 00000000..ee4ab8cc --- /dev/null +++ b/protocol-deviation-graph-guard/reports/demo-script.txt @@ -0,0 +1,12 @@ +Protocol Deviation Graph Guard demo + +1. Load synthetic protocol and experiment graph packets. +2. Compare observed experiment steps against required protocol steps and tolerances. +3. Check protocol version, reagent lot, and instrument calibration evidence. +4. Hold unsafe experiment-to-protocol and recommendation edges before publication. + +Decision: hold-unsafe-graph-edges +Held edges: 3 +Publishable edges: 2 + +Synthetic data only. No private studies, credentials, live graph services, or external APIs. diff --git a/protocol-deviation-graph-guard/reports/demo.gif b/protocol-deviation-graph-guard/reports/demo.gif new file mode 100644 index 0000000000000000000000000000000000000000..542a8a6a4e55537cbd2847be7d0ef28cec906333 GIT binary patch literal 54675 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%0A?mPT>_oxFKPMpl419Bo_w<62e6OQHE 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


p8>=Ft!p#%w$<1$#n(F3Hx5{F(v z54ei+ga$y$Xi0M(tuyPi&H04TtpnhuY0} zx(<-x8myWlfsnRd=tM7g+!?M`!=Fu)6zGj=>pOx7G53EtFVD9H9ib`pIDCBUeh5P2|iJExAP6AZ@Z z0&Zj6+I3o@&fCqg# zjHX@3c6~~Cd17c}gxfJGR)H_D(sx%xo{MuL``t{(-YIW>O80l9hEMLA$Z<=KMrZ9; zAM87a#%FjqpN_~bu!v885BE=r9dp?arz#6wj1#D-GtZjD@N7%Y#EdnEv)`_t*z9=3r-QA9H={iuTSyym%Fc{ zkEio!vx4ay5hi^|@#zH)AtIqR-R#`|a-pf3%wgWBYQA_5tVCpKWdaY;gH3Yp1*6DJ`qvY~8MMgPt zqtF-ff%UFs-j%s*w&j$B2(C8Y%;h)L0c;-l=LedUOXo`h`2$@0PyJElTfh4N;qdyG zX8W)k#X9M~e_w3fol`osK~rdZb2Av-Io zr|x1}TW`HvG>=^NdoF$U_}X8-`){`!e>$RCwDLF2lW1$Os~_p_mdBMvxxeEO%w5y$ z*#JFtK$8G_NJV^B>=kP+~XmQx=iNB6fj{F&G5Uk*LfGIEPk%mCMzQ48@~7W~LYxMg z!?ITmXOk8N3%LqME=!<-ZQ& z_5WoCU)juq@KkdhWk37mq+ug`H&KJ{<^@2=>a(*yi^q7V{ta}8A1eQA7#Tan3))pN zML$Q1JJaW?I zyUIrd0{AsHN!0L|qze(F z*Sezlrrd?7_=laK>#DXDr|EFrWcb-&@35NU-uv~FSE^|)L^0ZFw$S%7DTVr^d#ZnH zWt@qa92x$%LiCNI=e%HkF%|YBkNOBYmj=ADeTbm&H7KI#)fF)c$X&Hi0B7#_5TqGV zQ&*zh-;^&phOh~$JDLo_@dbE(oRqiC^mx_a5{m0=%oMnzXE9Y=elhPv?qvN(<*zF$ z`kE3}Ln<$`RY>Q!PS~S@810#l`fnWy1qIKUc(3?FD*EMeV8 zR@>3;PDbszt4sHPNSqQFdm3Udq<1QsVOl0rVovus@8a9?wW2941nS;m`>p5z^h152 z|Leo~Bpt5f*$uX3W#yOtxK-C_+(vLFY@hQIO>P+SC|#j*z@Mz3dN}2idnATWC9mXG z)O?g5lHwG#FZ85G+)F5Xw07diMu)1^TM#H z;qpS#k$>PhM*Ti~MjPA3F$}`a;Mp;EXqkoqMIM6VlJ zsD19Ktu3*TKi#BqPdkXFkJfLv>dJoIR~*Ym4JeTNs!q9_nPh$@(dDSr_o6Rq%9*A& zGwM%YNs!*bawm-bcC(k|c>L{H!b;#R@xKRlu#N+=ne*Bsk*8T#oqg`^mEA`j$XK6b zfWFIX|JV#1Qqi*-e8dW^dfP>j=MEjZKgv0-o25tz990WTJoD;^g7Qq^73nrd} z-{l_}32BjqsztRHMHmV?l=dJMs=C+G+Zl7t+l{(#ekHxBp)}z-@vw@ zG2?3mV$&%eW>lzq0gMy6=LpD67C$}KKSi_;7*YuF0|XEFbiS!bII^$3#GkelXAUsh zizaW15q(>yI{q9rmzO*IFw?CM?yeaofg8uR=dq5{uUx0SzhUPdXdqQBe z>78b;Pq!PY?ZIzJ!xPG%EB)?s>@q>QN0fe?kFD_zV@m{=CEvo83*bw7G=#{*mS*2-;>U) zOV0tiolex3R7;T(jbBB1UMW_ydK^ENVAU&k#Iefou)v$FsRIFSFnXYsMi&*9Ht^a8ETjNCE{%fAfq}+gS;D+?N(muf~GSYT$tuzpQnVW z9J|l|B1XNuI@MPexf`3N%)8a)tCyhD0Q!9R(@_7`-nz$G&%Z>U3@aVFe#j(7Uu1l} z57EH0{Qt!0|96Seld)kVF6RStW|!Wc?GGEh^@7H#3Kh>hT^YKsZ0zcjO^<`eTA{d-?J>2_7 z6AVj@xoT6yOF)qfjU4k^?Ige6`ELOZ4e|1C$tv8CcZ-Zde64W1dERjN#Lr~$Gr2qA z(*XFE$iWqE@OvE0L-{nY!t0|DL*6Hl1~_=6^ntgg;3aSPnOGk4X%Kay3H6mf{HYS20^|3H+X*j%R~$a7+9&-?+Q5FSM&CT@|2~U& zKWj3-^ZP%KSOxJB1FGUb@$tXu(?9cYKlqcl)2qMY<33VoK#u@Gx=RDzO9Sd-Jq83k zzyrbiD?y6@K@8Np4fF_BP{Gmjh!eDk`kM*EtAGcBMcz7cFZ`?H83q^jcU zy#J~CLa9>2{Chp``@${^!PuLL(tEwCDnq_&2|R?VHWVK@YzaCP#6N7mG)O?xD?mQ< zh{waisp7gqtig?2M7z^HsY=4%gQ`Tdhy|o7PD}$&BtNKnL-BFK;Y&h5v?dCis!XIp zsB%K_sYDM%#XD??;X^}NjH)+GKDU}hHRQTl?8A(sL-QEHTzo>gV#TV0zhb;Ws&a*_ zdWBUO1kYzg=lm`YZ}3Ayu@C7D{(Bm_)7zC+&EGEs!~M2xx&V&ibu6V z#!GAoaumZ))UA3vM~g^6^qWDkS_O7YgEoML%bGfVOoI`OID$OGsZvOHY^!;Us{dtF z$g1+jgQTj`qdbcA2#K7li_AzMw5DFX$Q$H7kEE)TRK9ey2#v%zhpZ}w6f0q@NeCQ9p0vr9z)8RINsH(}mej9c{6L_TID#z0M2tpNG><*}DxsVS3XDpN zP)Di4ygVGm+bh3N%qpu?tF3g&uN+H{SimquNAr+MYf?%`6rZ?k$uv;QmY79_Bgi0h z0~n>EA`SWX4SG#g|;ICxG7wa^R2& zV^s49)oY!J^6-dijR7qnQ}SpDZtw_g09P$ohL(5-NeF^8@Bv3a2aE7leK8MrjR7a1 z)u=jzG@yY-Fpp(8)-;#_GB~MvJsFD-Sc@pwld`6BXas2W0slr2pL8A9me^MFKv<~) z226$2RfSlIrC6#;)qZUWAV>xvn1PYCh(}0+b)5tWr}|^@!TN-P}!s z-ECVZ2m;JCj~SQ&L~sPYwI)c|9@vFf*;Uvya9xkET;~k}m@*IRO#@1hSw8LFsS;h% zHC=1^-psWK@-<(JAXekWUETEv=#^gT{VMBy28(##Gzed7QeH`L0-!Bh{heOyP2JVq zUWR2}=k46dr7FxlhBRP?Je5}S0No27UyGREG+0&~(*=*1f=BRRkAPDPv4|^}317ut zfE8i!Q3H?IRhgaIG$2!xCDt6ahzvH5V?C*Om{Q369*E0D^Z-119!}B&Oe) z$l)D^Dl<;rmKfog5Mql+WAVA;G%(pJ#$Tu!<0&>|i(uobs#K47V~ZH%LiXb{7+w`_ z2{x8vi=bl@PUBsji5j+u8J;|2rv2pZ5+7P;4!0Ai0oUSPfD znTP>s)#5ZDVq&EMU#6<|g_)>g;W|cUsVdt+-Qypg3FK{wY-MCG24-lztV(B#0B3RDW&f#KSITu+zMbXgy=QCU=OhCLlVxLRb{DFe zXVAqbC%}Z0KIv5zR&SoFMmCRcKn7Y^1bzlqn3m~{w&gTvWD6E6knYr~8eTGeWI4^? zolb)kmMZnhXsmKs(M{f%o@qV~i!?B4l*R;c79Y@^iFwZCsVZr!zG@DZs-j-wqn4|t z4(X~!X{?53^8ID6g=(CRS$l>mtrnkto!c~U)-<40k5Gd{Fa`0g>n6)D^N51I=2)y+ z>VQ>eYw}_7A=6N8iB!d9k8lD?epP9{Y^b{6ef0=gy=1XE?611ye)ZFEHfzte2+*!7 zT19H8YGx~F3C+grmRRhW$ZL-VDYwGNoVC}Yw?PIp4 z+zxF>R_NKbY)Td%*A}aI$knJq<*G7n02VT0o(X^j;^8&di%#sU+E}R;A9J{i9p(>`LT%3xJa1IW#7sWNZACT;p|38GE|{`PNtF6*jlk!85&i@t9H_lQ?r z@2UC*DW35Dt*Q#2i3^Xa{ho;gZ>t7>@Rs0k^B`0F=H2NAZ~PYQxLt6ux>hv+>uBZQ zs`Bt56I70BiDS*LR7LNp^6fu0k4h!h7{F=%2Ie&AVye35T$ZXQhbqKwDGq(sdcif)Ut1veYIj1Uf zWpVK#b7k>zx|#tZ?(V6g^MM7j5(WZfFb_CSgn|`is_G_chN|*-T}y6>Nf)0*NCQUI zR4O))e&yDAV)B-7VKdhBkcRV9wIXw_Xgdby1%xOZSLNc6MmD2x%7|UAJLg zhbv(xb`$UKZI3EEby#N>A7eN5MSgWB7Awl2bBl0wDlYV>>h@^QZy?L!E4YF$ZwZ(k za;m=cs5*yt)dH8E^Z$hZ7id)jNvL5xHV2K#|kJoDgwusvu zTC_5FWCd_uMeS!sd3%Mb#64EIhN|HOWs&drIWKw3e%*!VW`~c~1D6C$6?25ARs*JT zjMw;wWq6mK}Ac%n(hyqOT_Tc`iM*!N!ohnFxRv<`(R_1%|HIH*}1Ruy($(E{IeFovC z_r*7l!f#w~bppnZsz#_?AUJxof_xKh`I#t%mv8&c?|i7r)kb*nshRU6+4+sH%OzZ{^&NTi%x{%{SZAuX5Lq-@w0p zs4`a?=v5!8b@PCI)Iadmrz%0k`dCf_ZCHEU*L~)PdnN;RCu@IOHgz;H0RU3WZHx_^zjgjVLVSHy zY>1wA9j!{Vq|mJpt&(0{yEC)1644VG**TgJ0l!H{79bZhkr6Yi2@|`~w?Km7TY*tl zUR0c(l}J!k_*>K14DGjTH! z8Q236Ef#hI6t>AzMw8vNI#jwVj#-`0*sdjH?s|KyHFyhe_uL^g)s{raC* z-vwS~76v9FhyQ%xWny6eChh;j{h!>xotK^Ko8jbaV$aJ;WMTh3NZ%9Udknv^3>?14 z|G&`$_yYjqUnXHe0G_YU8{2LOc61Cp$9m1|7Nm@}1;_)P$qZPjF|1^%-xRD~0ssKm z|6Zt_Q)7p0lXRlgSC($KaTEWK4<1hRjhKwJy@Tg&3|eXRdWHAOXwR7p?OwH-{}B>k zx180ARlL4)xmdB2An27n#q5{Qnn|g%9Ds^>w=sznbQTkfy-Gv!9~_u1P(a?^umJ16 z38MSQCElf4w(zaF^zW!6+?KvBuzOv$RIcee7q-nRKIy8pK5?P#Dl^$37li3P^%@T^ zvwunr{?#gS{cC~bY6-f$(6N@CD)E1M6mp(l0068BLkMnQZ6=AMHRC0i7OL=Wyy4Dw zrJyhJM1UX1F?p02BdLQDvWt@DqIoq*?MGSl1BBr5ce?_%o6t(l&9AtVNm!M*&#Z9u z%*B@uoqdaOWvz$)D5**yR%54s;*i8uob#2f3tcO`6sz$SV}=*WS3kx)v0cen=+&iI zy9zqAnu_(zlHk;X9JDr}hsipan&qlCxzKu%oYc(IVmNoFAiIarB+E{ob6~uUwe!0` zv;FLL?vfBTT_?tgSuf{V9O}u{ex0v5v>x6{O9QH7bm}hX42!!n3q2FY3hdBSuHX~- z;870Z|E}LJX$6alAx~!stqwO|Er7G%2Er~yqD!tis{ryN)qU69>IZArDs1OXT+q*| zXfDLw``*B892Z%AJ4Sf^pq7^zqit%cIJMp^Xl>yc2nw-P;_0bXI?MB{hNP)OU5L1G z+m0qqtc=C2`BCmP>VN$8G^R8SabKY@>7cLKh4u#N*5Pb3y%WK2&n681$?RyZm7FSN zEXiYPk} zH&QjtpMGZ-nC}D*M=QhRlZS@jv$nwgajIM)`Vsiq6TnxCz@t2C^5VXw52dJLeTaFogIHT!UIr+Bv%Ve_0p@wqhXis@a7HQ$Q6U3DU506swHkB7`w2 z&ui0g`p&WVqgc8*gKYQbpQMoX%fxLJQ#b6dD679%%zu>04tEf1)t2SHrWBU_(>%>< zEiSig{O8Pf7SNh~ESNN##(H*esM>MH=n(b+vcJ#4JP`yV3{{)1?ylGEM#((dOieLI z5L6sodVv|IePz!Rs6$z#3J}V9fX$l%3s`L|_O@o=e zVli89eb*NC-tb6T#w(WD@t>=C8JsF?6zWXvbFYU+)TC|I?=BGRvEQK;vQ~%djJP47 zbQMV9C31>*KUnyUq+`z)Hocun+LM~wLl7BjZqNhD-LA(Qv;9BW=8}!7R7qP4ikTsm)Q|mTs?|hq+tDSXe%0^DQnGOo6 zI-Jss6CivkZ84t=_~Ml!QhX?n^hI#OL#()VSqZ@tv?Ugxxs9OrL-jIxSd#k~MPig#+H|q9SnyiZk|`?* zWh2l({#@!9S#EN1S!h0S?gA>h(7+f&9dlsg0Rf!@Nsp{~@DB?WciDulF>DZf`E3*& zQK$6UCdIFl&tuwI82VdLjje|7icy$JN18<^1*Y0^Iwu%I39Bol?tz?qS^dR>r- z{=k$Q-hflnzVSRE2Ug;|!c2abzAWia<1YMG?tlqt=}}OH?Ya7Uo#0B0qG4?ypoNM&{U!!hdVjZ2G0}R5S{=)-(H|b&OC2RwU>LY{ z@Zp!r@dRakLZHiBib{wA8FcJv|5b?`00n!UwphJ5A6ymI={SGF!r>7nS&t#o<5Jir zR0cxvhj2T#Ud(YA$oR%Y1aQkmVAezTi6&b-qi@xD4%~{PZ$+g!J64#xfPDUJ#;Lk~ zh5yB@tKHa;t+1i6z^@l2aO_E&)?E>?PsNEN9FVCnpGCTGEO(O;Y+T9<`|W{TKgQ;fpoUa_6afnY+9qTt=}2r4vRmbtk{=)oO|6JVSP`~l1r+f(ZZ#O@TDD}_ zB3}i>$czkTHK}!4KCmG*?;EJUbvFOJ#tpMGv%y2@BVH;NiLPAiu{h>`ysU-9zUJXd z4LRu7hEWd2dZ7BhEj0g=VJMaFNE=I0L@%54vLXawp)dPi68m(D}{XMghA$9pCrQvt9t z-upwi^V*r}!RC#!o4nZdzG~Te(l3Hkyc7QhxQMv9N{{%n>9dhXvFWlh|MBKupD~U& zOv5gRa3lnpYpTRUh8)>056%AMQ+(4pF;3mG)ym=1ZX7zCJg#+5UvBm>T435~zdt37 zSZiN`isKC`tPs@3*Cjui=AwRw^y#PaZ;Fq^JbYCfQ%(2I00$WjLl*PH2mBGL#af5^ zy5UTiCb5fAdrT}SG)U}a-UnXeX~;&`XwAIad{HvbxvvQQ@P~lw`(rR5PSa`OQ@f1n ziLg0<_Y9upuTU6v2Vwk(lISnh*aEXGp%7a6LiO_5o>s#hxFIKElyIZq_d(~Te=yoI zgl8)1wO1f6Ry>e);p8nt`H@)@ff2udQ?1cThBPTc1c3OdZNh_;IV!;Wbk-;wXlQ2~ z+b0w`BY6?c(xc8|Sv)%3%^ETf>{>07BW`o)b4U4aWM3yGJswTkq|+`cm?DVGXGAc40N6k(&Kg zJX~OG1INqt&(#R~W&(GHwzSqOR!~sZ_)(JjHh^CQW~C1t_aXjkjZiQI*Gx2V*yNR) zimm3Q2tQXh&jf-k$Mmhi=Lpjj|1Bwdo>4$C?DSI!VmbK!7cv7EzAhKBZaW9F!^Sq< zO}oKebzmDQ7#;WSAbzQFKD^|0faai*VbeIx(qd_b*sPJ}c_-l%Z}}^= z%Qf$d+7b5Afmzrh@P*I6d}yt08$;E`ocH!RV1N0`1^;Cm*A69s$LX$|+avdQN1vrv z5U~H96FO(?yW5@Of?mU8!d+4QRUzUO?F?&hO$3IBB>v{2fBp1^b;9|JGFj}U6Tad0 z1<=V%GiE8UbLPk&`^P}xj_DfMe+$y;8?6NQ48F)$))N7`(-U<+LL_ZY)F&ZoQ{PSN zZYC$K=p!(X@EEcJ&WwIe>Rnih!T8&x9KZBOE zncBj+hnAC*rdzm#IR8Ur*QxJ=Oo9qF`=9IB;3c-Ozd^H(5NmIPo6scB-Tlf-^*^${~Ut)nfll6bVYZgzd`7<$-HLwbePM zP82G6m)b8&?!%-d&?pPm4&f{#KiZ2PSRg)37);^FGh#ywH*$NN*vy1un+&Zh2wl7A z{`EyuygsZjM41q%QXW*zTBaDf)m8h)GnOzJG>y#}5mUr)^s<;4Cy^SW>^?}-A9~i7 zF$uO0E;R>I|Fosl^!0vo&jt0izHP(pSv;Aafh*t$Yx%u#>rC^5F!|^>63x_~^p+;_ zk;rk_kbz77=a8!rwxFCTR9T$Nws<$4eWaO+Tbvw(o4KBKNWUJQycY1> z$n}u#$VVS;jFnR@MD%1awgo_#l=umIlY0=?g=C*mMd?;*x{o}&#(sXm%bX9-TJ`*M zSPkLSA)*$(g|rci#4q9f9j{`-{ydMOOU6e+AL}xcktswi@#D%d-Z%hI_eA&PjPT3G zc1Smobayi$l(PPDM8F8%cw~nU=AYdkr;`j(+I1`x-lt{Se}2L-11tA=0uU<;3i%@+ zgKPtVf@xdI5G&~?jWW_K8P~<+k`u=q*?2frbw1%sQCB;xhphc^OGJ5h(W|gre{#3j z`E=LGam&SK(F*XxQunMb{Px|95JI*Fs>mO!y5=;DT{D2E)Y>NE`5BK(jV-pL83(9S z_!H|$qOk3R+whoi>WEzgysF(bqvib}!Y}#*&$0dvu)u(w`oAncQrQjbQU~KqFQ1>= z9tA*c_VARNgFW3sMM2dg0j@n=>jRx`RUE5E$b^=K4TZQk{z1~r}YsFoq)TSgqnWH56A7z>p*`Dzcb>B3)NP-JaDee`!?^ z>79Qo#L6#GwLI;9eaVa~9N2(rT>C(UZ1%I{M!6akwvSu}^b3qBymTcOJr zzbpCojc}VIJIKc;A8*Br%qpo!*6Pq|$rX!1k_{yv8d2 zvrhuOw+(<{H0BOlXsK5S{^{s|Hw%J6KZCty+E%9Q0p!e9j3Ie2s!#}f=P^{y$&Dns ziaq#zuhO%|`xsdiAG9nruTuIaHRvSb7TkK30?*|Hsl*}A0G4bBk+Tg(_#hgvc#q>l zR_-V0eraL2u9d+IM}~lQaFM9?bFX1n-JzS?q($2s6Qwl<;@>};e!wH_%}E%$=$$5S z$w0KU0v1M+00V;6uBWoIK)+GLK)k>xtVB;+9df)sV*|Zy-Gv9U)P*shTWBntqL0$P z_?jP5^T`xB+=K7XABEpvPHNedH2}1e9vn{Ks<^x7+zF1He99MKob`Wap`?_-m$JR!M7km&QZ! zaN#Qt&RhzneA1eg-%T0o?D7HqE6fI~&a|l}Wpdb->oYX5_6uy5Q1X3qxT;%Jgx>Md z5IuM>_QfG#@MS?HIK^oY$RUXacV;$_6x)oyEDV`LFgB~8mBG9(JuW0SHkks!E8nZw zfrV*8Y8<&_RXbluyth9Unry32JsbbRe5?uOIa*;=<~h#L&SbA2J`kN8>X8}Pf@(Mq z__-!rAS%p{HrR}V`zV)NTm3UtYsH6i+ zm@m4@Cc2Rc8OVovvr7nXFF*umo}bgu1MoZApbCz6t`IGN?k4S|jpsN&WuaEXR^3vusE*zeE*_)0G5E<{&)6hB_%zEUDBF1-#gr)k zN4!4swAgi{+pUR;Yk(89gTUOq_O*|A@Ai@R{nq7Wxa&t>>SOkd-A>=ef(`e8Z$(q6 znN_+XNNzFCZlp#fe=}7|X{A7wH#N_uP?MwtG4!${9;hcRV#oPcPrXWS{&88ul+ljMC=FN%e#+i_pkd*k`ItO(`->GXXDkbjjW#HSuB^2ewQA zzW=?*7?iFbMXk3jeyjkYQs%o$nAYUT>Xz!Q!!S8iyIZL9Cv{(cMbXqM)xv3q(XbfsJd#&v znMnci#3YQ}WZgS}C65TtqrqK``QE6i z#+Oe6EE+A85p8LDZYH|LA7Kn56ag?zA z39U@Vw$SthDZ{*FJ+)n3niBYP5_jp`e4_90_bvdY!#YZ_t09qMC-7>+qWEfmVjk~V4xAnQfOtk2p9;BQd{0M`_o^uuZO*n6NMEEgylF4UUMV9{ z6VH%yJv6EhcaXY&a1GL4dlyAy*$ue;X4#0DjsUrX+ohsEJWFjM9+Q=l-LJwVYS)if zvOF7bO5xsgHuMfvdogQgE82}3c`1vUr;nlCec)z7Y9rMxPud>sx|*lNtthJLa{3WG zW8~o_1#-q5dZ=qnGWC#wOe5eCAIrMc8;{aFyKi{L~1sBu;9dJpj z?fufzB5`n{5xD^#F7RI628n7+$QIgkt7B+@D1}mEVXKxIK~vp>_I0>Ja4j7or<3-2 zLri#ZO%Pbvdz8G165 zy2>eYq86mm0MVw~&PhUl4(y~JhP|-STJ>xCd;l9e{_05_i0VV*GxiA~YuRNs z*9%wy9#|V*Ept8_zo~bmckq@xuDGX<%>6mrqu-r0Y5IgY>udc4Z>WI9r{{+YU2r4v zYE64G5v%+&;A$prr^BZk$8dnu&odYHIPu;htMKDie`Epl%(&$(7cL`&={@P#XH9#q znXdHJ3V^gHt%}>t5{-Z|dX>Q%bbmFque58Dd}5j$ICGDt!1YF3=q|XIP|nr$sL^F9 zQFeIfF=)ivzTB08wQJy3J>>f4o9u^W)4A_q;yp{F%;G=Pk084F!`2*|O7&^GsBlwf z^Xv1-(d$L+*qTah%~Ahp0=FHp(YR){!^^kG=g2z`G_>ne;4h9dNz3iK1*N7ueBRv< z%k{Mfo(thP{y_U-p3jy^IVKE+S;*T<2JdCMhE1{0DsfMB;Bmz|%gwc=3BA&MXFLHh zEwzOZU4Q1MYaCMY#A{YabE1Q(4&P(>Eks=w(;hBP+GR35GY>r_B9#&;e%X)D()6)+ z6O5jsyoBBzImKObV&^(6f3VZJWWAKvbcYG4Ltm`Lz^qVBGaJ&JF#1HwZIfF7SyhoDn!wNJJoc~@(*|UMeSpsp9O(jF~TGR(L{GA zSvrCZvF&$vkk|tkR-QUSPo}5|ON~gWBtw&OiD1xyM(-~BBjlnH22j24NZ9X{WA@27 zu=Xzz6_93OT}P_AGt6WZ@Iq|Uw0=Kzu~+IR>r$c)PYvF3P19Axs|XlBpB}nkqZrx{ z_UX8;HrHhpV!_Rm#ju?aO(n*4tMtz$**%dTjzfgY=+d!Vq4|Uq<3Q9YI~but!>bV` z65&L-0uCh6M?cRuKv$#pTy2(+M}oh?3n|^Ag|3^z{s^TXb>sy{G&t~G_`4LhP9}m% zp0QDhZloP|F6a8=Tf5hUxy*&rYoVXI9wv&2R449W$s!X(%KZDYM*EM2bjo*_9^E;U ztxSN#hE!k`R|omVE=@wFs~pA7Q;dil{Kp!T<;TR~8}it5{>|bNKqmuRzCTU`e+X_2 z!f3pkF}8%(^224JSiAQV3$GbgRxOO9nO|srr89{tc7+DXtYA#s}0v_4#lQO2PvO!L%LQl^muvAbVvN3gDEej_Gz_aVTNxDfY* zq)v?j_gYaFs#4rv(E=&+B=9<)v>4EsJXPY%sPW4Ad*sx2?+9yEy9iPxf0ueL6I6ev^2({ks(YrZoE)Elaop${`5>E-Yhj36`f{FItI~8OqkejIAepp zi?Jbz#-_p-!gQrpn{ItW0NBBG0xS*h@xbX@idGN81Z+ShO9Qh9{z~T&2eAx zLkJnX7a91>K7oypf6{}G6K>|pNE^x{YA``A0A|1I-25ot>MCh^J{5L>#|KG@^D~!a=vsdEwv8#9OMX$?><=?S$7+H{AtdCDxX)q z^LinRT18n$Wqo{Rw_uErWZ*&ql-xZBFskkv_s7XK$Q3^!#>}{-q^tqzHJda^A%^lq z1ba{7jkffV+U`*PrbFv4r2?!B&CyyPqJG)_i3mg4EOu>y$L2Xcrcc`kF zj-3U1RhOPOXH6)n7^EBv>53O?;at41c?PWYul#A##!*+;-2UHDq_HJ=3uLlHvJDh$ zX9MdO@Dt_4s*#sPekSp*D9G+6g;v>POo?ymOg$|@lrS_zU`fd`fzE10n+f;_;pWJd?le+c)+H z6tkv{AyOfZ?^Ds|1}f(wP$s3cH9K88c@+0&V;mzi`yMK>h0=+}@o1Oo*&nBMt-Z1- zGK9nhA$D2P*0-OCmL468PL^lYS{RK2Qq|r9=J06jF+Qq{=C4-zYym8LR zHcCjerZh^vYVTICV`LNRNJWr%o)gV}Cejm|HvPCCG1{$4rTLI;K4MM2eh#T=L%JM= zgPi{&(05gSx4#*TEh8#)f=1lAE-IGtm`1M-?_q{z%pzy?ROH!e> zhAsyzdi%^A+@{KGBj1&q#!uZer>?M^F^V9+hnehsk8o`BPDfN-;2%0jdQ;QX> zQ&qVveF_ICrIxx<1)BxUyNHF`2<2i@!&}6qA6E)Rx1y>BncC=@X`|k2vJ3J)C-vyP?ldrR1ma_ zFfS=2X))RCe!3TpUz#}Pkrna?TQj9F=}TNFPE>M#bFwBYv3C(Wun|r06pl8(82cyUzZb6h6k6E z-l$R_Zhv9ft_k62znB-SSe799m4WR~%HhoiF14=$G1G%_=9$ww5*kFm(gNR86mAbU zv__mo@U`%^O!{`xxb`~BL6)pnU)ft}=)idbuLvJFsAQ#k=>)L_>6fYDm#Vd zd^gX@-aHB}wnlK2va=)O^Q53Y&S%d|K37e1u_w01bWJf@a&vlP#c@@{(5ELU>rCC! zE7htyC?o`VUuvJrV}O{i6IU7OXk$#wg#L5Q4rl0fOo$Q^T6%z^9gf2K6=QrO!w%=o z&`Nf5;p`xHMQ1tF-F1aEThjnfIDV`ePZK!IxkBL=(X4d*=NO`Nv2Z2SN(-yi7HK<= zsPboQ4R#E_xM^9z?SSW#A6m2yRj!yseFMKll8M-YeSo6V-SZmwx^x!EG0R8pSWt%= znaN0Ky}q`mGh9=Aslm}P5O{jdiUNik5N(CqxlwiP=Ad2cNpAc11VYGW`Oi$swB}PL z+3%(%E0ZGMF2N6)7^A*c>??fl$C?9sytyRwR4R|uj%O(L)LVh9A&XypYfA}qU;b9` zKB}fYUnR7^&Z?CC(dQcr!a76JMIkI>rj6NvWkD_&W;mS2-2g=Wrzik_uK@>p41-93e@n8f-Bvi^LuNMfcDAf36SIAA!M#v9R+!R!zY+asAl4s5I?oo{7?G*zv`+O{>ccQu(qF z95p{e8yS(>xk1W5Z~6O&B9cLL+NVwh7wv_{wQ@)%w7g3CLglhVlIy-?m^3O-0zCiv zbE|&#)Vh%;T5C*+%gD2GerrDs*FkVO<6|&i63=X+2$3FrHgQ<8OPzX}Gt%E*#?{H$ zZD^5tnpNPAjf#f3d~9DA5HZOL?TBCR)>jy#af@jqYcUq z^t{2_S0L$o*NHL_A?(uZeUrXuY;=gq#5u0q1F_uCdNcEI*rZ#1;abn_zQYez>^LuW zHi_mulH9MiOu~ta`R#8atUqD%k345ixu4RLNw9Fe(oo^t{-H$~Hh-{ob0A1&p@{~E0ciyz71JYeL_ z>DQZcBuB*m80|qQh;E>Rpc2YTSzlfczp7@FBFb*J>K{>e8#rTdtGFq5vnv0yK3_Mz zH}A~UoW6uE7RR06572U6YwS(kahg0c^|u(p?W->PFJ>w9{)vTTE6F~=!9Kg^h?M8Y z*%K;{DGcgt3+d?vNVioJqhG&6j`X^t06iooLw=l_?Klx#oD$*Puewz%=?B)4<}W?y z$Dwwb%Nar{Tyr_@GJ|q`Vy?VmB~DTnxk;44J}0Mg^aYtgz2X@BIA;F&q~{DbFD4*)5SJ^lLc zQg`QkWUzdQSVYB`Z4w~cJ^^+7J?vIQJ!>rB>935ezBmCUMnn2Li8*;&zoh z+-rtM1gjmZ4prwJOEx!_W<1Ne^(}JOS7cn5pKk%*5^e7wMG5W5{RQgtv!<}yhKCWJ zA-znig;Vdd5#wFzVqwbIYRi^jZLk0GrVGN7*?_Ahfl{)1C~P#s(nku1=Frs z!n*7_AXMQShLNioE03fN@b@PEJCfGjeBzFjw0@w|vN$6->Dok3Z5lD7g^o zav6lK3@_*M zlmH>1nMYoOsosjPGQ(`gE%s$i=MZlu$!7_ZR{XIfIWESv=nj`m+wso4z7gv6=AbPR z6)<7f#B%xPh<|hYCJsd>us(<>py36R<0R~>1yjSt1Px7R{U8lmK<2-k`t3Lw4xl?XdszC+dw1t|HnvCNMepLl&_D;!lT zxS9u_J&+ciN{I9*Tw<{!ieJgW7LXX>YrCni=1Brk6;iz(3Xt_*;Zv%)@~N_&m5j6Q zTLi%%rox`3ym}rZ!RmB!FioLZyAzvlme@J9C*7dyG%bABmN?EtxwJS;J`#S)6bfQi z%vzKCm?EE=sVawdn%}>I`qLB42l54VjGj!XBD5_~LzuVAiZn>sx;RfKi3pIE1;sU1 zD%z<~zo}?MjUX2p!ca0OhgAGkRb!yhfA}J$sEm z`h=g~)?-H#h;6-myc=u-R{&!Fc~ZqpnSN*D>)(U-isjE! zxeKRW)Fj@(uoZt_eg1~d4)o$Z{zyy2xl)5mMviEOYvzuOU*9|V+bOc5)Xk4fW-9TC z++<77j;iS{EpE(ac&zw*>;0W9-gCohrL1G_AzSvxqBtms;Lxq=%r=uKyzU5cdG2LL ziUZH5zWE<1So)O>N49>swGMiOo0?)ATl=KzudH_*SJN%h0G{a+zdV~bK8`FWulbB_ zRPZFIF-Uz!0+!Xyt)o;jNt?&9Xyt_t+50}&FDsOPeSAyPLd*%zp&rsXgPjtA2>4=+ z&l8uy8~&_c^#&pqsQTNE#1XZ#JD$i&2%$&UQ;UW@vpW8|3@?5K+05JdI_*0o*$yQQ z!*uR5=gtIJOC3UOvO?w}WL;`5b{&Sx9;?}3Ksx~~kFcXjjl0T7Huocp@F8Y{Z3pfg zaz(`kgs6gCq4(>f0L0;3ZTBkq^0-RDr)8L>-J)Q!r#^j$eI!XW>@kw|^P5Z$Cy6;> z5zjMBZBy5)8q1BPw~@z1^CRw{J@XsP z0jzfgV>WhJf6#zffok< zC4aQUdtmgx^#>d(N6>}Ny|oi&(ltcBkEHW^1?8HP?UljhB9k8o!n`MBbySnCz<@cBO=M@RXl(94;t~ zXm4feSQ)KunA0hZx7DpedU=_l`^cLrM&>m}N=eWlD`16{Xtv~{!Oxm*$j}$}bM9X( z!b-6r#oI2*3PC~>OXej!QOtgxeTr3g)a*4XQC44*MG-$CXu?A#fkmL@q@qS?jBXpY zB_y)JAgU;(ai{I705|h>;9AMBl$?I%6+w})E#LfXIT$w?)qo(gSJB0O^z?_2o*<4= z0U%iFV3GTI;wKG(dyt#I*SeA6yJWv3WT7SExj}jfuZ%514u7GQxPeHbtm4;k)MaC;Xm%mwPI(d*AnB5ZU_qdZ!@Px{;e zM|%Euq;y=yJ1>6KnFnDotN^x!6pIUxERwx=a9r*Y+bPUHRQ8Qj9fH+Z&{MJR9~2}_ zpM89Ms&e(L(H=OpqJy?gp~v0&%|@GP)Ia%_oedTgd^!pgG7*@e$EOGef?D{!M6s8P zq(>(9Zh%Os)I!Yp^}|MQt+m_A&RsGZjUR*GJhZwDp{4KQSe)rn8XUF9Tlrn|@2E>< z_Y&o5Ei``}0WB%H4qpu5lbYF8|6$JBR`6gFbiHcYxMu05(8?_@M$(1q zJg{}ruISoGSjarYw>VWcIm_L0b$iWR)2h4%_bFjE*eIm8k)+Ef$BY%#PwYB)(A(wRxJbN#2&L^~mdT$lQQxvqkP2VPyC z1+nJkED;r_)O-;KA)AljtwU4pGc_!WmDs)4RY{Yd+HVuiwC-c~&OXzf!5SOkNbkIW zmu-mlKOr#ah$HEs%QrxAzf;|N-_Khxf1@+WiR=!OPvjBGgDcZi5T3{WInWQRt@O(i zgO2tAtF5-aTZREg*E8|f$}fb>1h338ld&yG&_8MaHs;_d(~4q*Uw*q!OoUy}EwF%9I9uum;t|p;3Eyx6>4cb9v42-H{H1JE zvj3EtAIvewK#|-dTDEi{=-z!C4Jm?mD{acn0lk^bJu+xP4-|{;1qaqNhmwu@%ggFY zcf1h)Mz(kB(;$aV32+jl(}M9%V8`IUSrpYOup!|}Z^d46CtL%^nLvG%Wm#*;>1Rr3 zHKHOeFf3?paN1t0`nNwri)R?(Cxt-7j#s{n#B@SO+52VfET5t;@VHoxTvV}&;z9^x zy#D?amjy%;$NRJW+V<>r341=TS>0uyA94~Y3M>JUEL!?iB@?U#8UZy0KkNWiaXLlM zJkP4b(=$F*5=7wiao30PH~=wjut3{ai+|JH+GR%VISYBRC6SA{y(D}t+WsRW!w^3^ z&`RQKW7(-=T~!)6}IHoX4f&T!pb(Yod6h`^AOCtD+yv@MA$0V9*vP(^hk%ppOK@mW+SL{Z#i4rN~*DGwA}HXllW z7J0DJLkF}k*F#LJgA^nhFHBAdLyK2GD{&A8@e+u%xP5uKyP$+da!;4xqL&lEL3fsQ z6*8r^cZ@}?s02^fww9u8a3O))_QoY&BQ%T?ajXhgtq? zc1DrZEYJ_E0c$urkbR>8CTgB?K!wSwErWiQJmvyS-BheaXrG2|t_IKaxJXnN1WVzT znf7fC;nZzu*}(PB2H zg40d5MEP?}IwmbXAW{{+sx<6c)@fJ(N!~4j>dD!`3u8Milr<(W5kMG#^F+8UR!lBV zA5PLqvh&_5BhdC65gg@U@+>5cX>SjUp%#lVes_O;vl%!75~*nbYu_isj4}g$n3@tU z;t?0BfC*~i*#Gxw3IGEG?XaD?bf_G!zoq!OHy*oiH~V~1@oNKxZk}O}GW?aNOc97j zCUa~`=u)NT__@?l_5)f<=eZxTFRsX#&&^??b^b__2d`?V!Am+){e{H|C?pwWG(~-&`%Kw{ z8)!oMso81f>7m@Irl@DgaBL=v2YThWRpkgrahQG6^`{M7o|#`FzQh*NYR-al6=GGc zkgv`Nt4C>@*K+1>0!NN!+%Ot3``X;Zo1=E%Lpzy1G%^QOpv8wD*oyU5HJcCA?k?s7 zWgVf;odDA%O{%Ak3b)BAocX2??<;?J#QJi6kkOf9-aa#wu^&?txgcGgc)&$u5xtld za7yo_sgxkrnrA*$teGEXvYh_NX(8jDVOs!SGjf88Uxq%K3UDQ7e1e}Dvlu#&o1CdZ zD=IgO&-C?LfZhs#+v0m2V#|tZ z`fm9qf|Yku;-W{gXws!nAxk!O_pX>+TY}uX23K`iK=I>km4paqvYU{ApIL1n68Z8~Mcnb_T^Z61eTZFh< zZEEK{jGx!6qpb3dG&vS^GRS>|I}cW{hpBo7_n{FoE%OGT(Cgpp zr2KgX)?4PTA8>FFw5An$K4hl6usqSLkwu`b|*L(=dq2*>BYd~1ibek(7^v00)AapHaNtVVG-O~ zHLRq+c0hLOR2z^9`$}kZv991$9tt0s3FRK~5QYEw^zB_L9fnYEG{$P|R4AWSwj&YL zni76mZz2#cvJ?my`TmbC1Z|P9clc)QYp+@p)8#3WK{Ukt>%4~)q#!TNq-nSgd-M@_ zSio;Z2dI;NyZ~NX|AJdvd$e_B`1^u!&x3e>G92oQZiR5&_hKxxvi6XPu0Lefbz-iV z0d&HXbu=HT1lQ}nTdjD zjgQka_=5=jt+dTgsG{N8^P7#15iowy``Lwr7+gQ~#Zp>~UV`be&VT0Wqj zjHPneccjSsHFnz=KLtS(A?@kYOWj7Weql_~3om}M=UtufJ$Exb z{%#fzH&u=^h|Zn#t{6)9gZ@|IB?D)U%Lwax+x7d(xw~^}K7=YuuUc!q!91OJWao zl^3up@gdW$Od?v&Oo~i|o41hp3gz)pPQkSS_K(^~YeQ@-v0qoWd4+8j!4Df=p8|uy z37>%|<#%nk7|fN%){Jbg{CKish(qjj%sXmM!LpOf^{5tYIdxa?4~-O8Eak#Hj=Wb3 z5O{gLt9mKu_EPif-H4PN4~(I!Xw>1+or0eh2YY+}KI~7?l74wGtkQ!;$?e7UZ$zkDl~qRWqeqI!_V`KrD4os^ zvk>K>kdT6vinnA6tol=+-S6Fx{G}{_Tf$DwXKzHt5MVlm%Ev=xP%y@JXfPiCcU~gA z;i+j4yk)1h-^x#@{4z#L$*a-!F2dVWYg@XVyn%&Czd}K8cn@6&c3=(W@C4Gzm6rlkrQ1zr>`KF>ut)b6X(?H zpq0W^09~veQe^R-7#brx^O88Pk*4hE&_9MpvZLISwU4Y!COnWDm-a!oXgNWK3Fe8H ze-{L`x-Z2{7*6bg=iVkk(XtVvAV-6dL-t2zLS@eju(rc#qTBfO|M2yW(UmsQw(yQ^ zqoa;(+vwP~ZQJQ|Y&+@Lwr$(CotyW(=bZbE^WA&L*gw~rYu0)&o;|B(6-q&ff^X)P zX(`>J{=FEm*x=U9i7^9jVkTT;{2AWM;8z}ur-D5l5hvRYddjXV2{OAUqZ(byRD{?H zj4~79f(M_uJ_KhklM6>UOC*F3Yj*ar4L+qh5a3d=WDjbZa zWSW8EXR8zb5z}8nFWQo#&}2Z5t>Av!Rn$Igmu{c#_sIydhf0u#`BzwQ+dNL) zBs(pZK_)pvaZ1ewg0GN(efy-u?*j8j%=$I%SuVaUD?49$7Wk2&@HL9U&6+7w=<}u} zQ3uKL_n%5?wBNDkEK~>aW>94xeK5(df``zz#LB1}jSyCVqiK7CU%4IDy?pajjP%s% ze4sa3gjqo1(p9u+*ed)e=tZ?`-GHImyN0S{;82>+?jO6{CHE57IL?C(Rz=-QyvhE< zxubb1Necw|pl%a%!R&MLK*CcIeH29O(^Ko*#7RoA9epZKG2ghz%ApN50`=31a z0?G6cfyacfFb4gK{vl4m9^g>JkiUaz<|jS}Yvv}$Itjv{d)Yd~5=QDRsK zLUeASnp9B)!`(`kuGub>`mfQ04!vRY!bI*U12v{>Cj$77wvXRc2QEK}Zxwjw#0n}h zrLTrV##l`r^$)-b!&2cKj^5VlUnMD%v%(J7B9s^@ZB1-CKISNVh)Yyjz{9AOTnCED zm*qFhPCqD%h#90tZUYNTc_(&X$CQ4E+*mclL#+iQw7!);Y{q%JtoRw`sTfZ9!S#!Qh3(@mU( zxFz|x|(&tFN6X~d)OSxvT8fSQ= zwv_`m3Pg3YXG>O8HoIJxdJ{eFSHeWzrwKOp>V|BDqPgDNxpc@W{GyJ!>WD1H(O|jV zDf+T^+5KA0EECnPhu3e8dF^|-!o6~pj%H8jHF+h$laf=NIvkPwsudYA8MnGMPqkHV zI|u-PP|Sm;AO=M?I>dT)kM8n$h@VPL4T{g~@qs+WtNMmoTGVabAXX`)l3nM?Ytck1 zOSESNSa1!pM|zqLhWpX=O|n7jDIir|!?j2&0@%eN#FwcSh<3QbLthj7~axpCGC1ayp5E=y$oW%aKt@Oqa!XC*|v zBb5@|{J94yP)rApW>!Kh9viO%;*pVbDk~numE23@vs%TFVi>&5dAB`D!LeRejPvT} zxUv1R=n*Tw^@{T%{c+A0wCdDA4>}Fh(=A_jTJ)8W8tLAC5~I(x!Ci?-HmAy-jXO=U z@&)RJgWo5HTbZl_J&NLoEc&pZQ3~_Xa_QE?3Fh_+ICQUDnK}&$3C_aYSF?27g&@ML zwUxh?bwo}sIFeSX{N+w2!+i(|0rVUK2@PKyDg}Ih79&y_ay#fW3AxtA^U?ny|mvUSl&QL<27Qo3RgPjqgv1*5jyy`Lg*W0$^9fS{lQj>`r+{6Ly11wFN9|q^3 zTQlU_S%zKYRpD)8K5Wzta8e5qS3`i{80ydDePN-MP?zbCx4Y+DI(= z(Z*v!)6Kud5~R6^yt)+N8{7of^KNO=`Q=n}s-^XQ;?uM2*d1z9<7vA=nSvU%+1UMJ zLrg10 zqR3;S*t|C|Pn8_RAc-4QSBStwRR@K|TAM#?cHhvYjh=i9DTAs+OTn3;9GWhnlq#cF z6QW`+06-?_(Q?DWJM!6(bXp}5=$8cpC?je_FS3OlB=>3PFHP&wwVBe_w1P-3E|p0P z)}?UY*YID3W&PxNe^LTDDyW+>XpjcWd|FIJ#w^&LuxDfOdKCX;FAxiow|u5HR|0#j z$Vd?htsmjTQHPxGQ$hCqaF1&#s;&IHZA*{N+1!sWBP=_md*4Uin4OY-v>wS#(k4G+ zrVlE9p%_|O$adluf)1~RSEt(a;-^n?cjHxa?@2~WSP%snf1*m<&_=-_IqV4_vLtGH zKxzrl@lTQYV4b@_59iZ+bGa8H1V$y$t~Ol26%G;YIeOsQ$uj-nly3RBd*}OCswumx zjI1!~usaCkU@|#ir4tL7UW9^i%_AMH_K(t1?&#i>~&tXdr192$`weCN;jFyuD z_Y6x387nhRH*a`3wpM0L`dO<=Mqt^9GtFZi2)rpdgG!(43U49`d_#7{7@$YR39*?= zx$AB8M-V@;fQ!L&BFv;5-BM8Fsa}YYm0zlBoMs$u9mn#1RE%EzB&AoYx$qPVwQq^# zS-h;wiA-kho}vuK`4#&ogA&;c^oP!-@EkdZ`M{UyLrdCcu=i@ZHkp!kmJ~Rpus|@L zw(n4hdMHeyJKhp#^-Gfs+)LD3HOh&8Hlq_H007c?F1g&Zz z!=6{0l(HVlT!c72G|v0m%gjxV*oXjD{yWEbvZN4rCTS7mw%!55k{7e(Z#;K-w

v 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 literal 0 HcmV?d00001 diff --git a/protocol-deviation-graph-guard/reports/protocol-deviation-report.json b/protocol-deviation-graph-guard/reports/protocol-deviation-report.json new file mode 100644 index 00000000..97909d04 --- /dev/null +++ b/protocol-deviation-graph-guard/reports/protocol-deviation-report.json @@ -0,0 +1,119 @@ +{ + "generatedAt": "2026-06-01T15:45:00.000Z", + "module": "protocol-deviation-graph-guard", + "decision": "hold-unsafe-graph-edges", + "totals": { + "experiments": 2, + "findings": 7, + "holdEdges": 3, + "reviewEdges": 0, + "publishEdges": 2 + }, + "experimentReports": [ + { + "experimentId": "experiment:organoid-run-2026-05-18", + "protocolId": "protocol:crispr-neuro-042", + "riskScore": 0, + "decision": "publish", + "findings": [], + "edgeActions": [ + { + "from": "dataset:10.5555/scibase.neuro.2026.18", + "to": "protocol:crispr-neuro-042", + "type": "followed-protocol", + "action": "publish", + "riskScore": 0, + "reason": "protocol adherence evidence is sufficient" + }, + { + "from": "experiment:organoid-run-2026-05-18", + "to": "concept:neural-crispr-screen", + "type": "supports-concept", + "action": "publish", + "riskScore": 0, + "reason": "protocol adherence evidence is sufficient" + } + ] + }, + { + "experimentId": "experiment:organoid-run-2026-05-29", + "protocolId": "protocol:crispr-neuro-042", + "riskScore": 100, + "decision": "hold", + "findings": [ + { + "severity": "high", + "code": "protocol-version-mismatch", + "experimentId": "experiment:organoid-run-2026-05-29", + "message": "experiment used 2.0.0, current protocol is 2.1.0" + }, + { + "severity": "high", + "code": "instrument-calibration-expired", + "experimentId": "experiment:organoid-run-2026-05-29", + "message": "sequencer:mini-ion-17 calibration expired 4 days before run" + }, + { + "severity": "high", + "code": "unauthorized-reagent-lot", + "experimentId": "experiment:organoid-run-2026-05-29", + "message": "CAS9-Z99 is not approved for protocol:crispr-neuro-042" + }, + { + "severity": "critical", + "code": "parameter-out-of-tolerance", + "experimentId": "experiment:organoid-run-2026-05-29", + "stepId": "step:guide-rna-qc", + "message": "minOnTargetScore=71 deviates from 82 by 11, tolerance 3" + }, + { + "severity": "critical", + "code": "parameter-out-of-tolerance", + "experimentId": "experiment:organoid-run-2026-05-29", + "stepId": "step:incubation", + "message": "hours=61 deviates from 48 by 13, tolerance 4" + }, + { + "severity": "critical", + "code": "parameter-out-of-tolerance", + "experimentId": "experiment:organoid-run-2026-05-29", + "stepId": "step:incubation", + "message": "temperatureC=39.1 deviates from 37 by 2.1000000000000014, tolerance 0.5" + }, + { + "severity": "critical", + "code": "missing-required-step", + "experimentId": "experiment:organoid-run-2026-05-29", + "stepId": "step:sequencing-qc", + "message": "Amplicon sequencing QC was not observed" + } + ], + "edgeActions": [ + { + "from": "dataset:10.5555/scibase.neuro.2026.29", + "to": "protocol:crispr-neuro-042", + "type": "followed-protocol", + "action": "hold", + "riskScore": 100, + "reason": "protocol deviation evidence must be resolved before graph publication" + }, + { + "from": "experiment:organoid-run-2026-05-29", + "to": "concept:neural-crispr-screen", + "type": "supports-concept", + "action": "hold", + "riskScore": 100, + "reason": "protocol deviation evidence must be resolved before graph publication" + }, + { + "from": "experiment:organoid-run-2026-05-29", + "to": "recommendation:reuse-in-neurodegeneration-review", + "type": "eligible-for-recommendation", + "action": "hold", + "riskScore": 100, + "reason": "protocol deviation evidence must be resolved before graph publication" + } + ] + } + ] +} diff --git a/protocol-deviation-graph-guard/reports/protocol-deviation-report.md b/protocol-deviation-graph-guard/reports/protocol-deviation-report.md new file mode 100644 index 00000000..51f5af51 --- /dev/null +++ b/protocol-deviation-graph-guard/reports/protocol-deviation-report.md @@ -0,0 +1,38 @@ +# Protocol Deviation Graph Guard Report + +Generated: 2026-06-01T15:45:00.000Z +Decision: hold-unsafe-graph-edges + +## Totals + +- Experiments audited: 2 +- Findings: 7 +- Hold edges: 3 +- Review edges: 0 +- Publish edges: 2 + +## Experiment Decisions + +### experiment:organoid-run-2026-05-18 + +- Protocol: protocol:crispr-neuro-042 +- Risk score: 0 +- Decision: publish +- Edge actions: followed-protocol:publish, supports-concept:publish +- Findings: none + +### experiment:organoid-run-2026-05-29 + +- Protocol: protocol:crispr-neuro-042 +- Risk score: 100 +- Decision: hold +- Edge actions: followed-protocol:hold, supports-concept:hold, eligible-for-recommendation:hold +- [high] protocol-version-mismatch: experiment used 2.0.0, current protocol is 2.1.0 +- [high] instrument-calibration-expired: sequencer:mini-ion-17 calibration expired 4 days before run +- [high] unauthorized-reagent-lot: CAS9-Z99 is not approved for protocol:crispr-neuro-042 +- [critical] parameter-out-of-tolerance: minOnTargetScore=71 deviates from 82 by 11, tolerance 3 +- [critical] parameter-out-of-tolerance: hours=61 deviates from 48 by 13, tolerance 4 +- [critical] parameter-out-of-tolerance: temperatureC=39.1 deviates from 37 by 2.1000000000000014, tolerance 0.5 +- [critical] missing-required-step: Amplicon sequencing QC was not observed + +Synthetic data only. No private research data, payment systems, live graph services, or external APIs are used. diff --git a/protocol-deviation-graph-guard/reports/summary.svg b/protocol-deviation-graph-guard/reports/summary.svg new file mode 100644 index 00000000..f505b195 --- /dev/null +++ b/protocol-deviation-graph-guard/reports/summary.svg @@ -0,0 +1,15 @@ + + + Protocol Deviation Graph Guard + Recommendation-safe graph publication control for SCIBASE #17 + + 2 + publishable edges + + 3 + held graph edges + + 7 + protocol findings + Synthetic reviewer artifact. No live graph, credentials, private studies, or external APIs. + diff --git a/protocol-deviation-graph-guard/requirements-map.md b/protocol-deviation-graph-guard/requirements-map.md new file mode 100644 index 00000000..188e0f82 --- /dev/null +++ b/protocol-deviation-graph-guard/requirements-map.md @@ -0,0 +1,13 @@ +# Requirements Map + +Issue #17 asks for Scientific Knowledge Graph Integration: entity extraction, knowledge navigation, recommendation support, and safe linked graph metadata. + +This slice covers a distinct graph-publication control: + +- **Entity and relationship quality**: validates protocol, experiment, dataset, and recommendation edges before publication. +- **Knowledge navigation safety**: holds edges where a dataset or experiment claims to follow a protocol but evidence shows missing steps, expired calibration, lot mismatch, or incompatible protocol version. +- **Recommendation safety**: blocks recommendation edges when protocol deviations could make downstream reuse misleading. +- **Schema-style metadata readiness**: emits deterministic JSON and SVG reviewer artifacts that describe graph edge actions and reasons. +- **Reviewability**: includes tests, synthetic sample data, Markdown reports, and a demo video. + +Non-overlap: this is not a broad extractor, ontology drift, multilingual alias, temporal consistency, geospatial sample provenance, sample custody/cold-chain, software dependency, image metadata, funding provenance, relationship conflict, or measurement harmonization slice. It focuses only on experiment-to-protocol adherence and graph edge hold/release actions. diff --git a/protocol-deviation-graph-guard/sample-data.js b/protocol-deviation-graph-guard/sample-data.js new file mode 100644 index 00000000..bdd06804 --- /dev/null +++ b/protocol-deviation-graph-guard/sample-data.js @@ -0,0 +1,106 @@ +const samplePacket = { + generatedAt: "2026-06-01T15:45:00.000Z", + protocols: [ + { + id: "protocol:crispr-neuro-042", + version: "2.1.0", + title: "CRISPR neuron organoid perturbation assay", + calibrationValidUntil: "2026-05-25", + allowedReagentLots: ["CAS9-A17", "GUIDE-44B", "MATRIX-9"], + requiredSteps: [ + { + id: "step:cell-line-auth", + label: "Cell-line identity authentication", + required: true + }, + { + id: "step:guide-rna-qc", + label: "Guide RNA QC", + required: true, + parameters: { + minOnTargetScore: { expected: 82, tolerance: 3 } + } + }, + { + id: "step:incubation", + label: "Post-edit incubation", + required: true, + parameters: { + hours: { expected: 48, tolerance: 4 }, + temperatureC: { expected: 37, tolerance: 0.5 } + } + }, + { + id: "step:sequencing-qc", + label: "Amplicon sequencing QC", + required: true, + parameters: { + minReadDepth: { expected: 12000, tolerance: 500 } + } + } + ] + } + ], + experiments: [ + { + id: "experiment:organoid-run-2026-05-18", + protocolId: "protocol:crispr-neuro-042", + protocolVersion: "2.1.0", + performedAt: "2026-05-18", + datasetDoi: "10.5555/scibase.neuro.2026.18", + instrumentId: "sequencer:mini-ion-17", + reagentLots: ["CAS9-A17", "GUIDE-44B", "MATRIX-9"], + steps: [ + { id: "step:cell-line-auth", observed: {} }, + { id: "step:guide-rna-qc", observed: { minOnTargetScore: 84 } }, + { id: "step:incubation", observed: { hours: 47, temperatureC: 37.2 } }, + { id: "step:sequencing-qc", observed: { minReadDepth: 12380 } } + ], + proposedEdges: [ + { + from: "dataset:10.5555/scibase.neuro.2026.18", + to: "protocol:crispr-neuro-042", + type: "followed-protocol" + }, + { + from: "experiment:organoid-run-2026-05-18", + to: "concept:neural-crispr-screen", + type: "supports-concept" + } + ] + }, + { + id: "experiment:organoid-run-2026-05-29", + protocolId: "protocol:crispr-neuro-042", + protocolVersion: "2.0.0", + performedAt: "2026-05-29", + datasetDoi: "10.5555/scibase.neuro.2026.29", + instrumentId: "sequencer:mini-ion-17", + reagentLots: ["CAS9-Z99", "GUIDE-44B"], + steps: [ + { id: "step:cell-line-auth", observed: {} }, + { id: "step:guide-rna-qc", observed: { minOnTargetScore: 71 } }, + { id: "step:incubation", observed: { hours: 61, temperatureC: 39.1 } } + ], + proposedEdges: [ + { + from: "dataset:10.5555/scibase.neuro.2026.29", + to: "protocol:crispr-neuro-042", + type: "followed-protocol" + }, + { + from: "experiment:organoid-run-2026-05-29", + to: "concept:neural-crispr-screen", + type: "supports-concept" + }, + { + from: "experiment:organoid-run-2026-05-29", + to: "recommendation:reuse-in-neurodegeneration-review", + type: "eligible-for-recommendation" + } + ] + } + ] +}; + +module.exports = { samplePacket }; diff --git a/protocol-deviation-graph-guard/test.js b/protocol-deviation-graph-guard/test.js new file mode 100644 index 00000000..97c89ea6 --- /dev/null +++ b/protocol-deviation-graph-guard/test.js @@ -0,0 +1,55 @@ +const assert = require("assert"); +const { samplePacket } = require("./sample-data"); +const { auditProtocolDeviationGraph, renderMarkdown, renderSvg } = require("./index"); + +const report = auditProtocolDeviationGraph(samplePacket); + +assert.strictEqual(report.module, "protocol-deviation-graph-guard"); +assert.strictEqual(report.totals.experiments, 2); +assert.strictEqual(report.totals.publishEdges, 2); +assert.strictEqual(report.totals.holdEdges, 3); +assert.strictEqual(report.decision, "hold-unsafe-graph-edges"); + +const safeExperiment = report.experimentReports.find( + (item) => item.experimentId === "experiment:organoid-run-2026-05-18" +); +assert.ok(safeExperiment); +assert.strictEqual(safeExperiment.decision, "publish"); +assert.deepStrictEqual(safeExperiment.findings, []); + +const riskyExperiment = report.experimentReports.find( + (item) => item.experimentId === "experiment:organoid-run-2026-05-29" +); +assert.ok(riskyExperiment); +assert.strictEqual(riskyExperiment.decision, "hold"); +assert.ok(riskyExperiment.findings.some((finding) => finding.code === "missing-required-step")); +assert.ok(riskyExperiment.findings.some((finding) => finding.code === "protocol-version-mismatch")); +assert.ok(riskyExperiment.findings.some((finding) => finding.code === "unauthorized-reagent-lot")); +assert.ok(riskyExperiment.findings.some((finding) => finding.code === "parameter-out-of-tolerance")); +assert.ok(riskyExperiment.edgeActions.every((edge) => edge.action === "hold")); + +const markdown = renderMarkdown(report); +assert.ok(markdown.includes("Protocol Deviation Graph Guard Report")); +assert.ok(markdown.includes("hold-unsafe-graph-edges")); +assert.ok(markdown.includes("Synthetic data only")); + +const svg = renderSvg(report); +assert.ok(svg.includes("