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?