From 1b90d21ebfd19a05095e4702dc1356ae79ac7563 Mon Sep 17 00:00:00 2001 From: build-with-dhiraj Date: Sun, 21 Jun 2026 19:31:32 +0530 Subject: [PATCH] feat(seed): replace synthetic Okafor seed with the REAL McClean Lab (public data) Swaps the prototype's single seed lab from the synthetic "Okafor Lab" to the real McClean Lab (PI Megan N. McClean, Dept. of Biomedical Engineering, UW-Madison), populated only from cited public evidence. All four flows + the guided tour now render coherently with McClean data and real citations. INTEGRITY BOUNDARY (documented at the top of src/lib/data.ts): REAL (from public sources, never invented): - LAB identity, mission, dept, Room 3156 ECB [mccleanlab.bme.wisc.edu] - PEOPLE names/roles/emails (emails left "" where not public) [mccleanlab.bme.wisc.edu/people/people/] - SKILLS, EQUIPMENT + models (Nikon Eclipse Ti, Eppendorf 5810R/5418) [openwetware.org/wiki/McClean:_Nikon_TI_Basic_Use] - REAGENTS + catalog numbers (PEG Sigma P3640, carrier DNA Sigma D1626, glass beads Fisher 11-312B, filter Nalgene 295-4545) [openwetware.org/wiki/McClean:Yeast_Transformation] - PROTOCOLS + steps + why + hazards (yeast transformation, Nikon Ti startup) - TACIT_NOTES verbatim (PEG-through-filter, carrier-DNA boil, scope warm-up, mandatory log book) - ONBOARDING journey (Statement of Expectations, WisCard, Ashley Prochaska HR, Larry Wheeler keys, OWW/CAE/Quartzy, biosafety training) [openwetware.org/wiki/McClean:_Joining_The_Lab] DEMO (synthesized, marked illustrative; captured at onboarding in production): - skills-competency MATRIX cell states - per-person joined dates, isNewHire / leavingInDays flags - the literal sole-ownership claim Bus-factor-1 thread is grounded in REAL named-author protocol attribution [openwetware.org/wiki/McClean:Protocols]: Ping Xu owns the "P. Xu" FISH variant (departing-expert thread), Renee Szakaly owns the "Mix & Go" competent-cell prep. The departing/new-hire TIMING is marked demo. New hire = Timothy Wakiyama (real roster member). Capturing Ping's FISH know-how drops bus-factor-1 risks 2 -> 1. CI: typecheck + next build green. Zero em-dashes. JoVE branding and DESIGN-SYSTEM intact. README data-provenance note updated. Co-Authored-By: Claude Opus 4.8 (1M context) --- README.md | 8 +- src/components/flows/BrainFlow.tsx | 7 +- src/components/flows/JourneyFlow.tsx | 158 +++--- src/components/flows/MatrixFlow.tsx | 108 ++-- src/components/flows/SetupFlow.tsx | 16 +- src/components/tour/TourProvider.tsx | 4 +- src/lib/data.ts | 709 ++++++++++++++++----------- src/lib/graph.ts | 95 ++-- src/lib/scripts.ts | 194 ++++---- src/lib/types.ts | 4 +- 10 files changed, 726 insertions(+), 577 deletions(-) diff --git a/README.md b/README.md index 3158dd5..dc60bd8 100644 --- a/README.md +++ b/README.md @@ -6,11 +6,11 @@ A polished, clickable prototype of a JoVE product concept: a Lab Operating Syste > ### Confidential prototype. Not an official JoVE product. > -> This repository is an internal product **concept** and an **unofficial prototype**, not an official JoVE product, feature, or release. It runs entirely on **synthetic data** and contains **no real JoVE assets, customer data, or content**. The "AI" is scripted, not a real model. This is **NDA-sensitive** and **not for external distribution**. +> This repository is an internal product **concept** and an **unofficial prototype**, not an official JoVE product, feature, or release. It contains **no real JoVE assets, customer data, or content**, and the "AI" is scripted, not a real model. The lab seed is built from **real, publicly available** information about one real lab (the McClean Lab at UW-Madison, via its public website and OpenWetWare wiki); a small set of non-public fields (the per-person training matrix, joined dates, and the departing/new-hire timing) is **clearly marked as illustrative demo data**, since capturing exactly those fields is the product's own value proposition. See the integrity boundary at the top of `src/lib/data.ts`. This is **NDA-sensitive** and **not for external distribution**. **Live demo:** https://labos-prototype.vercel.app -It is built to be shown to stakeholders (scientists and executives) *instead of* a written PRD. Every flow is set on a single cohesive fictional lab, the **Okafor Lab** (Neurodegeneration and iPSC Models, UC San Diego), so the data stays consistent end to end. +It is built to be shown to stakeholders (scientists and executives) *instead of* a written PRD. Every flow is set on a single cohesive real lab, the **McClean Lab** (biological signal processing in yeast, Dept. of Biomedical Engineering, UW-Madison), populated from that lab's public website and OpenWetWare wiki, so the data stays consistent end to end. Non-public fields are marked as demo (see `src/lib/data.ts`). ![joVE | LabOS landing page](./_screenshots/v2/01-landing.png) @@ -84,7 +84,7 @@ labos-prototype/ ├─ src/ │ ├─ app/ # Next.js App Router: landing, layout, and /flows/* routes │ ├─ components/ # brand, landing, shell, graph, tour, ui, and the four flows -│ └─ lib/ # synthetic data, graph builder, scripted "AI", and types +│ └─ lib/ # real-lab seed (+ marked demo fields), graph builder, scripted "AI", types ├─ _screenshots/ # full-page captures of every flow, the landing, and the tour ├─ DESIGN-SYSTEM.md # design tokens, color, type, and component conventions ├─ tailwind.config.ts # the JoVE design-token source of truth @@ -97,6 +97,6 @@ The visual language (tokens, the WCAG-AA JoVE palette, typography, and component ## Status and disclaimer -This is an early-stage **prototype** built to communicate a product concept. It uses **synthetic data only**, no real JoVE assets, and no real AI. It is **proprietary and confidential**, **NDA-sensitive**, and **not for external distribution**. +This is an early-stage **prototype** built to communicate a product concept. The lab seed is real, publicly sourced data about the McClean Lab (with non-public fields clearly marked as illustrative demo); it uses no real JoVE assets and no real AI. It is **proprietary and confidential**, **NDA-sensitive**, and **not for external distribution**. All rights reserved. This is not open-source software and ships with no license grant. diff --git a/src/components/flows/BrainFlow.tsx b/src/components/flows/BrainFlow.tsx index aaaebfe..40c7d5d 100644 --- a/src/components/flows/BrainFlow.tsx +++ b/src/components/flows/BrainFlow.tsx @@ -9,6 +9,7 @@ import { EXAMPLE_QUESTIONS, CHAT_SCRIPTS, } from "@/lib/scripts"; +import { LAB } from "@/lib/data"; import type { ChatTurn, Citation } from "@/lib/types"; import { Sparkle, @@ -58,7 +59,7 @@ export function BrainFlow() { variant: "abstain", confidence: "abstain", text: - "I can only answer from the Okafor Lab's own captured knowledge, and I don't have a grounded source for that yet. I won't guess at a lab procedure. If this is a real gap, capture it and route it to the right owner.", + "I can only answer from the McClean Lab's own captured knowledge, and I don't have a grounded source for that yet. I won't guess at a lab procedure. If this is a real gap, capture it and route it to the right owner.", followUp: "Capture this gap", } as ChatTurn); @@ -102,12 +103,12 @@ export function BrainFlow() {
Lab Brain - Okafor Lab + {LAB.name}
Grounded in 6 protocols,{" "} - 3 tacit notes,{" "} + 4 tacit notes,{" "} 10 skills
diff --git a/src/components/flows/JourneyFlow.tsx b/src/components/flows/JourneyFlow.tsx index 069135d..bb299d2 100644 --- a/src/components/flows/JourneyFlow.tsx +++ b/src/components/flows/JourneyFlow.tsx @@ -8,7 +8,7 @@ import { StatusBadge, Thumb, } from "@/components/ui/primitives"; -import { SOFIA_JOURNEY } from "@/lib/scripts"; +import { NEW_HIRE_JOURNEY } from "@/lib/scripts"; import { personById, protocolById } from "@/lib/data"; import type { JourneyStep } from "@/lib/types"; import { useCompliance } from "@/components/shell/ComplianceProvider"; @@ -27,8 +27,8 @@ import { Fingerprint, } from "@/components/icons"; -const sofia = personById("sofia")!; -const liang = personById("liang")!; +const newHire = personById("tim")!; +const trainer = personById("megan")!; type View = "path" | "step" | "checkpoint" | "trainer" | "verified"; @@ -53,10 +53,10 @@ export function JourneyFlow() { /> } > - A personalized onboarding path, auto-targeted to a new rotation + A personalized onboarding path, auto-targeted to a new PhD student's gaps. Completion is gated on verified competence, not view counts. @@ -93,18 +93,18 @@ export function JourneyFlow() { } function RolePill({ view }: { view: View }) { - const trainer = view === "trainer"; - const p = trainer ? liang : sofia; + const isTrainer = view === "trainer"; + const p = isTrainer ? trainer : newHire; return (
- {trainer ? "Trainer view" : "Learner view"} + {isTrainer ? "Trainer view" : "Learner view"}
{p.name}
@@ -120,11 +120,13 @@ function PathView({ verified: boolean; onOpenStep: () => void; }) { - const steps = SOFIA_JOURNEY.map((s) => { - // After the flow completes, the passaging checkpoint reads as done/verified. - if (verified && s.id === "j-passaging") + const steps = NEW_HIRE_JOURNEY.map((s) => { + // After the flow completes, the yeast-transformation checkpoint reads as + // done/verified and the next locked step opens up. + if (verified && s.id === "j-yeast-check") return { ...s, status: "done" as const }; - if (verified && s.id === "j-icc") return { ...s, status: "active" as const }; + if (verified && s.id === "j-microscopy") + return { ...s, status: "active" as const }; return s; }); @@ -138,13 +140,13 @@ function PathView({
{/* progress header */}
- +

- {sofia.name} + {newHire.name}

- Rotation student + PhD student

Personalized path ·{" "} @@ -164,11 +166,11 @@ function PathView({

- Tailored to Sofia. She arrives - strong on Western blot and sterile pipetting from her prior lab, so - LabOS skipped those{" "} - and targets her real gaps: aseptic technique, iPSC culture, and ICC - basics. + Tailored to Tim. He arrives + verified on aseptic technique from his prior lab, so LabOS{" "} + skipped that and + targets his real gaps: the lab's yeast transformation, the Nikon + Ti, and FISH.

@@ -179,7 +181,7 @@ function PathView({ key={s.id} step={s} isLast={i === steps.length - 1} - onOpen={s.id === "j-passaging" ? onOpenStep : undefined} + onOpen={s.id === "j-yeast-check" ? onOpenStep : undefined} /> ))} @@ -197,11 +199,11 @@ function PathView({ Competency checkpoint
- Passaging iPSC-derived neurons + Yeast transformation checkpoint
~40 min · with Dr. - Liang Wei + McClean
Open step @@ -212,9 +214,9 @@ function PathView({
Why this order?

LabOS sequences by skill prerequisites in the graph. Aseptic - technique underpins iPSC culture, which underpins passaging, so the - path can't put her on the bench before the foundations are - verified. + technique underpins yeast transformation, which underpins the + microscopy and FISH work, so the path can't put him on the + bench before the foundations are verified.

@@ -315,7 +317,7 @@ function StepView({ onBack: () => void; onCheckpoint: () => void; }) { - const protocol = protocolById("passaging")!; + const protocol = protocolById("yeast-transformation")!; return (
@@ -332,12 +334,11 @@ function StepView({

- Passaging iPSC-derived neurons + Yeast transformation (LiAc)

- Local fork · {protocol.modifications}{" "} - modifications + Lab-original method

@@ -348,13 +349,13 @@ function StepView({ {/* embedded video placeholder */}

JoVE peer-reviewed content, clipped to this exact step of the - lab's fork. + lab's method.

@@ -409,9 +410,10 @@ function StepView({

Every step carries the rationale an expert would skip, the - “curse of knowledge.” Sofia learns why ROCK - inhibitor goes in the night before, not just that it does. - So she can generalize instead of blindly following an SOP. + “curse of knowledge.” Tim learns why the + carrier DNA is boiled before every transformation, not just{" "} + that it is. So he can generalize instead of blindly + following an SOP.

@@ -420,19 +422,19 @@ function StepView({
  • - Tacit note · Dr. Liang Wei + Tacit note · Dr. Megan N. McClean
  • - Y-27632 · laminin-521 + PEG 3350 · carrier DNA
  • - Biosafety cabinet + Eppendorf 5810R
  • @@ -443,7 +445,7 @@ function StepView({ ); } -// ---- View: competency checkpoint (Sofia submits evidence) ------------------ +// ---- View: competency checkpoint (the new hire submits evidence) ----------- function CheckpointView({ onBack, onSubmit, @@ -473,7 +475,7 @@ function CheckpointView({

    Competency checkpoint

    - Passaging iPSC-derived neurons · not just “watched” + Yeast transformation (LiAc) · not just “watched”

    @@ -490,8 +492,8 @@ function CheckpointView({

    - Why do we add ROCK inhibitor (Y-27632) the evening before a - single-cell passage rather than at the moment of replating? + Why do we boil the single-stranded carrier DNA before every + transformation rather than reusing an old freeze-thawed aliquot?