// Open Labbook — Contributions page. // Visualizes who contributed what, at which research stage. // Individuals, AI agents, and institutions are first-class actors. function LabbookContribDapp() { const sidebar = ( <>
NOTEBOOK
NB-219 / Glia–Neuron Pruning
main · 142 commits
PREPRINTOPEN
); // Six research stages with stacked share by actor TYPE // shares = [HUMAN, AI, INSTITUTION] — sum to 1 const stages = [ { k: 'IDEA', label: 'Idea & framing', total: 18, shares: [0.66, 0.22, 0.12], commits: 8, bounties: 0, color: 'oklch(0.74 0.10 60)' }, { k: 'HYPO', label: 'Hypothesis', total: 24, shares: [0.50, 0.34, 0.16], commits: 11, bounties: 1, color: 'oklch(0.62 0.13 70)' }, { k: 'PROTO', label: 'Protocol design', total: 36, shares: [0.42, 0.18, 0.40], commits: 18, bounties: 2, color: UB.accent }, { k: 'EXP', label: 'Experimentation', total: 84, shares: [0.36, 0.12, 0.52], commits: 42, bounties: 4, color: 'oklch(0.55 0.10 240)' }, { k: 'ANALYZE', label: 'Analysis', total: 56, shares: [0.32, 0.54, 0.14], commits: 31, bounties: 3, color: 'oklch(0.50 0.13 280)' }, { k: 'WRITE', label: 'Writing & review', total: 32, shares: [0.58, 0.30, 0.12], commits: 22, bounties: 2, color: 'oklch(0.40 0.06 260)' }, ]; const totalContrib = stages.reduce((a, s) => a + s.total, 0); // Top contributors — mix of HUMAN / AI / INSTITUTION const contributors = [ { name: 'malcolm.h', type: 'HUMAN', role: 'Lead PI · Conceptualization · Writing', share: 28, stages: 'idea·hypo·write', tis: 85.8 }, { name: 'GLIA-AGENT v3', type: 'AI', role: 'Lit review · figure regen · pipeline runs', share: 16, stages: 'hypo·analyze', tis: '—', sub: 'on-chain agent · audited' }, { name: 'a.mwangi', type: 'HUMAN', role: 'Investigation · Data curation', share: 14, stages: 'exp·proto', tis: 62.4 }, { name: 'UCSF Weill Inst.', type: 'INSTITUTION', role: 'Wet lab · IACUC · 2P rig time', share: 12, stages: 'proto·exp', tis: '—', sub: 'verified org · institutional SBT' }, { name: 'r.tanaka', type: 'HUMAN', role: 'Methodology · Protocols', share: 8, stages: 'proto', tis: 71.2 }, { name: 'CzBiohub CRO', type: 'INSTITUTION', role: 'Confocal IHC · 96 slices', share: 6, stages: 'exp', tis: '—', sub: 'CRO · paid 1,800 UBR' }, { name: 'k.iyer', type: 'HUMAN', role: 'Formal analysis · Software', share: 6, stages: 'analyze', tis: 58.0 }, { name: 'STATS-AGENT v2', type: 'AI', role: 'Hierarchical model fit · MCMC', share: 4, stages: 'analyze', tis: '—', sub: 'agent · slashable bond' }, { name: 'NIH BRAIN Init.', type: 'INSTITUTION', role: 'Funding · grant compliance', share: 3, stages: 'idea·write', tis: '—', sub: 'funder · 9,000 UBR' }, { name: 'l.park (anon)', type: 'HUMAN', role: 'Peer review (blind)', share: 2, stages: 'write', tis: 'ZK', sub: 'identity proof · ZK-verified' }, { name: 'j.osei', type: 'HUMAN', role: 'Validation · Visualization', share: 1, stages: 'write·analyze', tis: 44.6 }, ]; // 60-day commit timeline by actor type const timeline = Array.from({ length: 60 }, (_, i) => { // varying mix per day const human = Math.round(2 + 4 * Math.abs(Math.sin(i / 4)) + (i % 7 < 5 ? 1 : 0)); const ai = Math.round(1 + 3 * Math.abs(Math.cos(i / 3)) * (i > 18 ? 1 : 0.4)); const inst = Math.round(0.8 + 2 * Math.abs(Math.sin(i / 9 + 0.5)) * (i > 8 ? 1 : 0.2)); return { d: i, h: human, a: ai, i: inst }; }); const tlMax = Math.max(...timeline.map(t => t.h + t.a + t.i)); // CRediT-style activity matrix: 14 CRediT roles × 3 actor types const credit = [ 'Conceptualization', 'Methodology', 'Software', 'Validation', 'Formal analysis', 'Investigation', 'Resources', 'Data curation', 'Writing — orig.', 'Writing — review', 'Visualization', 'Supervision', 'Project admin', 'Funding acquisition', ]; // density 0–3 per cell; same shape every render const density = [ [3, 2, 1], [2, 1, 2], [1, 3, 0], [2, 2, 1], [1, 3, 0], [2, 1, 3], [1, 0, 3], [2, 2, 1], [3, 1, 0], [2, 1, 1], [1, 3, 0], [3, 0, 1], [2, 0, 2], [1, 0, 3], ]; // Stage stacked bar (HUMAN | AI | INSTITUTION) const TYPE_COLORS = { HUMAN: UB.ink, AI: UB.accent, INSTITUTION: 'oklch(0.55 0.10 240)', }; const Pill = ({ type }) => ( {type} ); return ( Filter actor Export CRediT.json Anchor split on-chain } /> {/* TOP STRIP — totals by actor type */}
{[ ['CONTRIBUTIONS · TOTAL', String(totalContrib), '142 commits · 12 bounty claims', UB.ink, null], ['HUMANS', '7', '4 lab + 2 ext + 1 anon ZK', UB.ink, 'HUMAN'], ['AI AGENTS', '3', '2 audited · 1 pending', UB.accent, 'AI'], ['INSTITUTIONS', '4', '1 funder · 1 univ · 2 CRO', 'oklch(0.45 0.10 240)', 'INSTITUTION'], ].map((s, i) => (
{s[4] && } {s[0]}
{s[1]}
{s[2]}
))}
{/* LEFT */}
{/* STAGE BREAKDOWN */}
HUMAN AI INSTITUTION SHARE OF STAGE WORK
{stages.map((s, i) => { const w = (s.total / Math.max(...stages.map(x => x.total))) * 100; return (
{s.k}
{s.total}
{s.label}
{/* Stacked bar */}
{s.shares[0] >= 0.18 ? `${Math.round(s.shares[0] * 100)}%` : ''}
{s.shares[1] >= 0.18 ? `${Math.round(s.shares[1] * 100)}%` : ''}
{s.shares[2] >= 0.18 ? `${Math.round(s.shares[2] * 100)}%` : ''}
{s.commits} commits
{s.bounties} bounties
view ›
); })}
{/* COMMIT TIMELINE — stacked area by actor type */}
{timeline.map((t, i) => { const total = t.h + t.a + t.i; const totalH = (total / tlMax) * 86; return (
); })}
− 60 D HYPOTHESIS LOCK EXP COHORT 4 PREPRINT NOW
{/* CONTRIBUTORS LEDGER */} {contributors.map((c, i) => (
{c.type === 'AI' ? '◇' : c.type === 'INSTITUTION' ? '◫' : c.name[0].toUpperCase()}
{c.name}
{c.sub &&
{c.sub}
}
{c.role}
{c.stages}
{c.share}%
{c.tis}
))}
SUM · 100% · 11 actors · 32 verified contributions + DISPUTE A SHARE
{/* RIGHT */}
{/* DISTRIBUTION DONUT */} {(() => { const totals = [0, 0, 0]; contributors.forEach(c => { const idx = c.type === 'HUMAN' ? 0 : c.type === 'AI' ? 1 : 2; totals[idx] += c.share; }); const sum = totals.reduce((a, b) => a + b, 0) || 1; const pct = totals.map(t => t / sum); // SVG donut const r = 56, cx = 70, cy = 70, sw = 18; const C = 2 * Math.PI * r; let off = 0; const arcs = pct.map((p, i) => { const len = p * C; const arc = ( ); off += len; return arc; }); return (
{arcs} {contributors.length} ACTORS
{[ ['HUMAN', totals[0]], ['AI', totals[1]], ['INSTITUTION', totals[2]], ].map((row, i) => (
{row[0]} {row[1]}%
))}
); })()}
{/* CRediT × ACTOR-TYPE MATRIX */}
ROLE {['H', 'A', 'I'].map((l, i) => (
{l}
))}
{credit.map((role, i) => (
{role} {density[i].map((d, j) => (
))}
))} {/* AI provenance */} {[ { name: 'GLIA-AGENT v3', ops: 'lit-review · figure-regen · pipeline', model: 'Claude Sonnet 4.7 · audited', bond: '120 UBR', color: UB.accent }, { name: 'STATS-AGENT v2', ops: 'hierarchical model · MCMC fits', model: 'open-source · BUGS-MCMC fork', bond: '64 UBR', color: UB.accent }, { name: 'SEM-INDEXER', ops: 'paper embedding · semantic recall', model: 'open · sentence-T5', bond: '— (read-only)', color: UB.ink3 }, ].map((a, i, arr) => (
{a.name} AI
{a.ops}
{a.model} bond · {a.bond}
))}
Every AI commit is signed with the agent's key, replays its prompt + tool-trace from IPFS, and posts a slashing bond if its output is later disproved.
{/* Institutions */} {[ { name: 'UCSF Weill Inst.', role: 'Wet lab · IACUC · 2P rig', share: '12%', via: 'institutional SBT' }, { name: 'CzBiohub CRO', role: 'Confocal IHC · 96 slices', share: '6%', via: 'paid 1,800 UBR' }, { name: 'NIH BRAIN Init.', role: 'Funding', share: '3%', via: '9,000 UBR grant' }, { name: 'VitaDAO', role: 'Co-funding', share: '1%', via: '1,200 UBR' }, ].map((o, i, arr) => (
{o.name}
{o.role} · {o.via}
{o.share}
))}
{/* Anchor on chain */}
When the preprint is published, this split anchors as a CRediT-attestation NFT. Each actor's wallet receives a credit token that flows TIS, citation rewards, and royalties.
Preview attestation Anchor v0.4
); } window.LabbookContribDapp = LabbookContribDapp;