From 1753277b71c4055662437560e99a796d2ae0a99e Mon Sep 17 00:00:00 2001 From: VibhavSetlur Date: Wed, 3 Jun 2026 11:53:56 -0500 Subject: [PATCH 1/2] feat(team): add Research Associates section with Vibhav Setlur Per Sam Seaver's request, begin refreshing the team roster. This change adds a "Research Associates" category and lists Vibhav Setlur (Argonne National Laboratory). No existing entries removed. Also makes TeamMember.imageSrc optional and renders an initials placeholder in app/team/page.tsx when a member's photo is not yet available, so further names can be added incrementally as screenshots arrive. Co-Authored-By: Claude Opus 4.7 (1M context) --- app/team/page.tsx | 29 ++++++++++++++++++++++------- app/team/team.module.css | 15 +++++++++++++++ lib/data/team.ts | 16 ++++++++++++++-- 3 files changed, 51 insertions(+), 9 deletions(-) diff --git a/app/team/page.tsx b/app/team/page.tsx index 749c927a..b1b5dff5 100644 --- a/app/team/page.tsx +++ b/app/team/page.tsx @@ -42,13 +42,28 @@ export default function TeamPage() { {category.members.map((member) => (
- {/* eslint-disable-next-line @next/next/no-img-element */} - {member.name} + {member.imageSrc ? ( + /* eslint-disable-next-line @next/next/no-img-element */ + {member.name} + ) : ( +
+ {member.name + .split(' ') + .map((part) => part[0]) + .filter(Boolean) + .slice(0, 2) + .join('') + .toUpperCase()} +
+ )}

{member.url ? ( diff --git a/app/team/team.module.css b/app/team/team.module.css index de7057f6..5754556d 100644 --- a/app/team/team.module.css +++ b/app/team/team.module.css @@ -21,6 +21,21 @@ object-fit: cover; } +.avatarPlaceholder { + flex-shrink: 0; + width: 160px; + height: 160px; + border-radius: 4px; + background: #e6e8eb; + color: #4a5563; + display: flex; + align-items: center; + justify-content: center; + font-size: 48px; + font-weight: 500; + letter-spacing: 1px; +} + .teamMember h4 { margin: 0 0 2px 0; } diff --git a/lib/data/team.ts b/lib/data/team.ts index d5864c07..28012c6e 100644 --- a/lib/data/team.ts +++ b/lib/data/team.ts @@ -24,8 +24,8 @@ export interface TeamMember { affiliation: string; /** Institution website URL */ affiliationUrl?: string; - /** Path to team member image (relative to /public) */ - imageSrc: string; + /** Path to team member image (relative to /public). Optional — page renders an initials placeholder when absent. */ + imageSrc?: string; /** Image width in pixels (for consistent layout) */ imageWidth?: number; /** Image height in pixels (for consistent layout) */ @@ -204,6 +204,18 @@ export const TEAM_DATA: TeamCategory[] = [ }, ], }, + { + title: 'Research Associates', + level: 'h3', + members: [ + { + name: 'Vibhav Setlur', + url: 'https://github.com/VibhavSetlur', + role: 'Research Associate', + affiliation: 'Argonne National Laboratory', + }, + ], + }, { title: 'Developers', level: 'h3', From bf8a3e3de235e0f1254807e6a1cbde80687cac51 Mon Sep 17 00:00:00 2001 From: VibhavSetlur Date: Wed, 3 Jun 2026 12:46:56 -0500 Subject: [PATCH 2/2] test(biochem): make integration-test probe resilient to network flakes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Biochem Integration Tests suite intentionally degrades to "skipped" when staging.modelseed.org is unreachable, but the live probe in beforeAll had no internal timeout — on slow CI networks the vitest hookTimeout (10s) fired before the catch block could mark isApiAvailable = false, turning the whole suite (and CI) red. Race the probe against an explicit 7s timer so the catch path always runs first; observed master CI flake matched this same signature on 2026-06-03. Co-Authored-By: Claude Opus 4.7 (1M context) --- tests/unit/api/biochem.test.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/tests/unit/api/biochem.test.ts b/tests/unit/api/biochem.test.ts index 6b6e14d2..b32b0f12 100644 --- a/tests/unit/api/biochem.test.ts +++ b/tests/unit/api/biochem.test.ts @@ -15,8 +15,17 @@ describe('Biochem API Integration Tests', () => { beforeAll(async () => { biochemApi = await loadBiochemApi(); + // Race the live probe against an internal timeout so the catch path runs + // (marking isApiAvailable = false) before the vitest hookTimeout aborts the + // hook itself. Otherwise CI fails on slow networks even though the suite is + // designed to skip gracefully when the API is unreachable. try { - const res = await biochemApi.getReactions({ limit: 1 }); + const res = await Promise.race([ + biochemApi.getReactions({ limit: 1 }), + new Promise((_, reject) => + setTimeout(() => reject(new Error('Biochem API probe timed out after 7s')), 7000), + ), + ]); expect(res.docs).toBeDefined(); } catch (e: unknown) { console.warn('Biochem API is unavailable, skipping tests:', getErrorMessage(e));