// Project Pipeline — LIMS that lives ABOVE Open Labbook.
// 7 screens: pipeline overview, AI hypothesis (drug discovery), grant builder,
// protocol designer, experiment marketplace, LaTeX drafting, submit checklist.
// Third-party integrations are surfaced at every stage.
const PIPE_PROJECT = 'Astrocyte-mediated GABA reuptake · LTP modulation';
const PIPE_ID = 'PRJ-NB-219';
function PipeRail({ active }) {
return (
<>
PROJECT
{PIPE_PROJECT}
{PIPE_ID} · stage 4 of 7
EXECUTING
14d in
>
);
}
function PipeCrumb({ items }) {
return (
{items.map((it, i) => (
{it}
{i < items.length - 1 && › }
))}
);
}
// Reusable integration chip strip (third-party apps at every stage)
function IntegrationStrip({ apps, title = 'INTEGRATIONS' }) {
return (
{title}
{apps.map((a, i) => (
{a.name}
))}
Add
);
}
// ───────────────────────────────────────────────── PIPELINE · OVERVIEW ───────
function ProjectPipelineDapp() {
const stages = [
{ n: 1, t: 'Ideation', s: 'Problem framing · prior art scan', state: 'DONE', pct: 100, dur: '6d', owner: 'M.H.', tone: 'ok' },
{ n: 2, t: 'Hypothesis', s: 'AI drug-discovery agent · 3 leads', state: 'DONE', pct: 100, dur: '4d', owner: 'M.H. + Twin', tone: 'ok' },
{ n: 3, t: 'Grant', s: 'NIH-R01 · 2.4M USD funded', state: 'DONE', pct: 100, dur: '38d', owner: 'L.S.', tone: 'ok' },
{ n: 4, t: 'Protocol', s: '14 steps · 3 reagents pending QC', state: 'ACTIVE', pct: 64, dur: '3d', owner: 'R.O.', tone: 'accent' },
{ n: 5, t: 'Experiment', s: 'CRO Charles River + automation rig', state: 'ACTIVE', pct: 18, dur: '11d', owner: 'CRO', tone: 'accent' },
{ n: 6, t: 'Drafting', s: 'LaTeX · §1 outline only', state: 'PENDING', pct: 8, dur: '—', owner: 'M.H.', tone: 'default' },
{ n: 7, t: 'Submit', s: 'Target: Cell · pre-flight 0/12', state: 'PENDING', pct: 0, dur: '—', owner: '—', tone: 'default' },
];
return (
}>
}
title="Project Pipeline"
sub="A research project from idea to publication, in seven stages. Each stage hands off to the next; integrations plug in at every junction."
actions={<>
Team · 7
Integrations · 14
Advance stage
>}
/>
{/* Pipeline chevron map */}
{stages.map((st, i) => {
const isActive = st.state === 'ACTIVE';
const isDone = st.state === 'DONE';
return (
STAGE {st.n}
{st.t}
{st.s}
{st.dur} · {st.owner}
);
})}
{/* Health & dependencies */}
# Stage · summary State Owner % done Duration Action
{stages.map((st, i) => (
{st.n}
{st.state}
{st.owner}
{st.pct}%
{st.dur}
Open →
))}
{/* Activity */}
{[
['17:08', 'protocol', 'R. Okafor', 'Replaced step 7 reagent (TTX → TTX-citrate · QC pass)'],
['16:42', 'experiment', 'Charles River', 'Cohort B · 12 / 24 mice processed · 92.4% retention'],
['15:30', 'protocol', 'Twin', 'Auto-flagged step 11 — variance > 8% on 3 prior runs'],
['14:18', 'grant', 'NIH', 'Disbursed milestone M2 · 580K USD → treasury'],
['11:02', 'hypothesis', 'M. Harriot', 'Promoted lead H-3 (astrocyte GAT-3) to active hypothesis'],
].map((a, i, arr) => (
{a[0]}
{a[1].toUpperCase()}
{a[2]}
{a[3]}
))}
{[
['Schedule risk', 0.34, 'on track'],
['Budget burn', 0.62, '1.4M of 2.4M'],
['Reproducibility κ', 0.88, 'predicted'],
['Reviewer match', 0.74, '12 candidates'],
['Compute headroom', 0.56, '8.4 GPU-mo left'],
].map(([k, v, n], i) => (
{k}
{n}
0.7 ? UB.ok : v > 0.4 ? UB.ink : UB.warn }} />
))}
{[
['M. Harriot', 'PI', 'UCSF', 'accent'],
['L. Singh', 'Co-investigator', 'UCSF', 'default'],
['R. Okafor', 'Postdoc · protocols', 'UCSF', 'default'],
['A. Mwangi', 'Eng · automation', 'CZB', 'info'],
['Charles River · M.O.', 'CRO lead', 'Charles River', 'ok'],
['Twin · M⁂', 'AI agent', 'local', 'accent'],
['+ 1 reviewer', 'unassigned', '—', 'warn'],
].map((r, i) => (
{r[3] === 'accent' ? 'PI' : r[3] === 'info' ? 'PARTNER' : r[3] === 'ok' ? 'CRO' : r[3] === 'warn' ? 'NEEDS' : 'CO'}
))}
{/* Integrations strip */}
);
}
// ─────────────────────────────────────────────── HYPOTHESIS · AI AGENT ───────
function PipelineHypothesisDapp() {
return (
}>
}
title="AI drug-discovery agent"
sub="The agent reads your library, queries chem-bio databases, simulates targets via AlphaFold/Boltz, and proposes ranked hypotheses you can promote or reject."
actions={<>
Switch to manual
Sandbox
Promote H-3 → protocol
>}
/>
{/* Left — agent loop */}
Find a molecular handle that selectively reduces astrocytic GABA reuptake, increasing tonic inhibition without depressing LTP induction in CA1 pyramidal cells.
{['target: GAT-3', 'tissue: cortex/CA1', 'modality: small molecule', 'tox: low', 'permeable: BBB', 'similar to: SNAP-5114'].map(c => (
{c}
))}
{[
['retrieve', 'Pulled 184 refs on GAT-1/2/3 selectivity · 22 with kinetic data', UB.ink2],
['simulate', 'AlphaFold-3 · GAT-3 + 3 candidate scaffolds · ΔΔG range −5.2 → −9.1 kcal/mol', UB.accent],
['filter', 'Excluded 14 hits failing CYP3A4 / hERG admet rules', UB.warn],
['rank', 'Ranked by selectivity over GAT-1 (rank-norm), 6 leads remain', UB.ink2],
['critique', '3 leads share scaffold to SNAP-5114 — propose orthogonal lead H-3 (β-amino acid linker)', UB.ok],
['cite', 'Patel & Mehta 2025 (arXiv:2503.18112) — useful prior on attention decoding for binding pose', UB.info],
].map(([k, t, c], i, arr) => (
))}
{[
{ id: 'H-3', t: 'β-amino acid linker analog of SNAP-5114', target: 'GAT-3', sel: 0.92, dock: -8.7, tox: 'low', pos: 'PROMOTED', tone: 'accent' },
{ id: 'H-1', t: 'Cyclic guanidinium scaffold', target: 'GAT-3 / GAT-1', sel: 0.78, dock: -9.1, tox: 'med', pos: 'CANDIDATE', tone: 'ok' },
{ id: 'H-4', t: 'Allosteric Na⁺-coupling disruptor', target: 'GAT-3', sel: 0.71, dock: -7.4, tox: 'low', pos: 'CANDIDATE', tone: 'ok' },
{ id: 'H-2', t: 'Lipophilic SNAP-5114 derivative', target: 'GAT-3', sel: 0.62, dock: -8.2, tox: 'high', pos: 'REJECTED', tone: 'bad' },
].map((h, i, arr) => (
{h.id}
{h.t}
{h.target}
sel · {h.sel}
{h.dock}
{h.tox}
{h.pos}
))}
{/* Right — molecule preview + actions */}
{/* schematic protein/binding visual */}
{/* protein ribbon — wavy */}
{[0, 1, 2, 3, 4, 5].map(i => (
))}
{/* ligand */}
{[[155, 105], [165, 100], [175, 108], [170, 118], [160, 120], [150, 115]].map(([x, y], i, arr) => (
))}
{[[155, 105, 165, 100], [165, 100, 175, 108], [175, 108, 170, 118], [170, 118, 160, 120], [160, 120, 150, 115], [150, 115, 155, 105]].map(([x1, y1, x2, y2], i) => (
))}
GAT-3 · TM5/TM8 BINDING POCKET · pose 03
{[
['Lin & Harriot 2024 · Cell Reports Methods', 'rwif scoring · §3'],
['Yamamoto et al. 2025 · Nat. Neurosci.', 'replication of Lin 2024'],
['SNAP-5114 patent · US6093570', 'lead scaffold prior art'],
['Patel & Mehta 2025 · arXiv:2503.18112', 'pose decoding'],
].map((r, i) => (
))}
The agent cannot promote without your signature. All reasoning is logged to UB-Chain.
{[['Twin · proposed', 'ok'], ['L. Singh · co-investigator', 'ok'], ['M. Harriot · PI', 'pending'], ['IRB / IACUC required', 'default']].map((s, i) => (
{s[0]}
{s[1] === 'ok' ? '✓ SIGNED' : s[1] === 'pending' ? 'AWAITING' : 'INFO'}
))}
);
}
// ───────────────────────────────────────────────────── GRANT BUILDER ─────────
function PipelineGrantDapp() {
return (
}>
}
title="Grant builder"
sub="Compose a grant once. Submit to NIH, NSF, Wellcome, or pitch to research DAOs on UB-Chain. Templates align fields and budgets to each call."
actions={<>
Browse open calls · 184
Pitch to DAO
Submit application
>}
/>
{/* Left — call selector */}
R01 · Distributed Brain Initiative
NIH NINDS · ceiling 3.0M USD · 5y
Mechanistic studies of glia–neuron interactions across cortical regions, with mandatory open data and reproducibility commitments.
Deadline · 14 Jun 2025
Review cycle · Q3 2025
Earliest start · Mar 2026
{[
['Wellcome · Neuroscience Investigator', '4.0M GBP', '92%'],
['NSF · CAREER', '500K USD', '88%'],
['VitaDAO · Astrocyte Track', '300K UBR', '84%'],
['Molecule · IP-NFT lab launch', '~250K USD', '78%'],
].map(([n, b, m], i) => (
))}
{/* Center — composer */}
{[
['1', 'Specific Aims', 'COMPLETE', 'ok', '412 of 1 page'],
['2', 'Significance', 'COMPLETE', 'ok', '1.2 of 2 pages'],
['3', 'Innovation', 'COMPLETE', 'ok', '0.9 of 1 page'],
['4', 'Approach', 'EDITING', 'accent', '8.4 of 12 pages'],
['5', 'Preliminary data', 'COMPLETE', 'ok', '5 figures attached'],
['6', 'Bibliography', 'AUTO · 184 refs', 'ok', 'pulled from library'],
['7', 'Budget · year-by-year', 'EDITING', 'accent', '1.4 of 2.4M'],
['8', 'Budget justification', 'PENDING', 'warn', '—'],
['9', 'Facilities & resources', 'COMPLETE', 'ok', 'auto from UCSF'],
['10', 'Equipment', 'COMPLETE', 'ok', '14 items'],
['11', 'Biosketches', 'COMPLETE', 'ok', '3 of 3 signed'],
['12', 'Letters of support', 'PENDING', 'warn', '2 of 4 received'],
['13', 'Data & resource sharing plan', 'COMPLETE', 'ok', 'IPFS + Zenodo'],
['14', 'Vertebrate animals', 'COMPLETE', 'ok', 'IACUC #21408'],
].map(([n, t, st, tone, meta], i, arr) => (
{n}
{t}
{st}
{meta}
Edit
))}
AIM 1. Identify a selective astrocytic GAT-3 modulator with low neuronal-network impact. We will deploy lead H-3 (a β-amino linker analog of SNAP-5114) generated by the project's AI hypothesis agent (Pipeline §2)…
AIM 2. Characterise the impact of GAT-3 modulation on hippocampal LTP induction and maintenance, using paired-pulse, theta-burst and chemical-LTP paradigms, in mouse acute slice…
AIM 3. Translate to behavioural relevance via a Gad65-cre × GAT3-flox conditional model and operant memory tasks, with an automated home-cage phenotyping CRO partner (see Letters of Support).
{/* Right — budget + DAO mode */}
{[
['Personnel', 0.54, '1,296'],
['Equipment', 0.12, '288'],
['Reagents · animals', 0.18, '432'],
['Compute · UB-Chain', 0.06, '144'],
['CRO · Charles River', 0.07, '168'],
['Other · IRB · indirect', 0.03, '72'],
].map(([k, v, n], i, arr) => (
))}
{[
['NIH eRA Commons', 'PRIMARY', 'accent'],
['NSF (parallel)', 'OPTIONAL', 'default'],
['VitaDAO · pitch', 'COMPLEMENT', 'ok'],
['Molecule · IP-NFT', 'COMPLEMENT', 'ok'],
].map((d, i) => (
{d[0]}
{d[1]}
))}
Pre-flight check
{[
['Page limits', 'ok'],
['Required figures (5/5)', 'ok'],
['Biosketches signed', 'ok'],
['Letters of support (2/4)', 'warn'],
['Budget caps · personnel', 'warn'],
['Animal protocols', 'ok'],
['Data sharing plan', 'ok'],
].map((v, i) => (
{v[0]}
{v[1] === 'ok' ? '✓' : '!'}
))}
);
}
window.ProjectPipelineDapp = ProjectPipelineDapp;
window.PipelineHypothesisDapp = PipelineHypothesisDapp;
window.PipelineGrantDapp = PipelineGrantDapp;