Skip to content

Commit df52b19

Browse files
jeremymanningclaude
andcommitted
Offboard nine undergrads; make offboarding rebuild the site and CV
Moves Jennifer Xu, Om Shah, Sarah Parigela, Aidan Miller, Ben Hanson, Ellie Mattox, Sam Haskel, Ahmad Wahab and Andy Kim to alumni, and regenerates people.html and the CV. offboard_member.py now runs the same rebuild_pages() as onboarding (people.html + CV PDF/HTML) instead of printing a reminder, with --skip-rebuild for batches. parse_lab_manual.move_member_to_alumni keeps the manual's own capitalization (it wrote 'jennifer xu') and writes a one-year stint as '(2026)', not '(2026 -- 2026)'. New end-to-end tests run the real script on a sandboxed copy of the repo. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01N4s2iBPpdWdLNyRRcGDXUt
1 parent 6aedd08 commit df52b19

11 files changed

Lines changed: 184 additions & 88 deletions

File tree

‎CLAUDE.md‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,9 @@ python scripts/add_borders.py photo.jpg images/people/ --face
4646
# Onboard new member (from scripts/ dir)
4747
python onboard_member.py "First Last" --rank "grad student" --photo headshot --skip-llm
4848

49-
# Offboard member to alumni (from scripts/ dir)
49+
# Offboard member to alumni (from scripts/ dir). Updates people.xlsx, the CV
50+
# source and the lab-manual, then rebuilds people.html and the CV
51+
# (--skip-rebuild to batch several, then build once)
5052
python offboard_member.py "member name" --end-year 2025
5153

5254
# Reconcile people across website, CV, and lab-manual

‎data/people.xlsx‎

-801 Bytes
Binary file not shown.

‎documents/JRM_CV.html‎

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -550,23 +550,23 @@ <h4>Undergraduate Advisees</h4>
550550
<li>Katherina Cohen (2026 – )</li>
551551
<li>Pattapol "Phoom" Sirimangklanurak (2026 – )</li>
552552
<li>Malique Auguste (2026 – )</li>
553-
<li>Ahmad Wahab (2026 – )</li>
554-
<li>Andy Kim (2026 – )</li>
553+
<li>Ahmad Wahab (2026)</li>
554+
<li>Andy Kim (2026)</li>
555555
<li>Isaac Cheon (2026 – )</li>
556556
<li>Jason Kang (2026 – )</li>
557557
<li>Mak Kelly (2026 – )</li>
558558
<li>Miles McDonald (2026 – )</li>
559559
<li>Theo Larson (2026 – )</li>
560-
<li>Aidan Miller (2025 – )</li>
560+
<li>Aidan Miller (2025 – 2026)</li>
561561
<li>Alexandra Wingo (2025 – )</li>
562562
<li>Alishba Tahir (2025 – )</li>
563563
<li>Andrew Richardson (2025 – 2026)</li>
564564
<li>Angelyn Liu (2025 – )</li>
565565
<li>Annabelle Morrow (2025 – 2026)</li>
566566
<li>Azaire Andre (2025 – )</li>
567-
<li>Ben Hanson (2025 – )</li>
567+
<li>Ben Hanson (2025 – 2026)</li>
568568
<li>Colson Duncan (2025 – )</li>
569-
<li>Ellie Mattox (2025 – )</li>
569+
<li>Ellie Mattox (2025 – 2026)</li>
570570
<li>Emmy Thornton (2025)</li>
571571
<li>Evan McDermid (2025 – 2026)</li>
572572
<li>Jackson C. Sandrich (2025 – 2026)</li>
@@ -577,7 +577,7 @@ <h4>Undergraduate Advisees</h4>
577577
<li>Luca Gandrud (2025 – 2026)</li>
578578
<li>Owen Phillips (2025 – 2026)</li>
579579
<li>Rodrigo Vega Ayllon (2025)</li>
580-
<li>Sam Haskel* (2025 – )</li>
580+
<li>Sam Haskel* (2025 – 2026)</li>
581581
<li>Will Lehman (2025 – )</li>
582582
<li>Abigayle McCusker (2024)</li>
583583
<li>Andrew Cao (2024)</li>
@@ -606,16 +606,16 @@ <h4>Undergraduate Advisees</h4>
606606
<li>Grace Wang (2023)</li>
607607
<li>Grady Redding (2023 – 2024)</li>
608608
<li>Jake McDermid (2023 – 2025)</li>
609-
<li>Jennifer Xu (2023 – )</li>
609+
<li>Jennifer Xu (2023 – 2026)</li>
610610
<li>Maura Hough (2023 – 2024)</li>
611611
<li>Megan Liu (2023 – 2024)</li>
612612
<li>Michael Chen (2023 – 2024)</li>
613613
<li>Mira Chiruvolu (2023 – 2024)</li>
614614
<li>Natalie Schreder (2023)</li>
615-
<li>Om Shah (2023 – )</li>
615+
<li>Om Shah (2023 – 2026)</li>
616616
<li>Raselas Dessalegn (2023)</li>
617617
<li>Safwan Rashid (2023)</li>
618-
<li>Sarah Parigela (2023 – )</li>
618+
<li>Sarah Parigela (2023 – 2026)</li>
619619
<li>Sergio Campos Legonia (2023)</li>
620620
<li>William McCall (2023)</li>
621621
<li>Xueyao Zheng (2023)</li>

‎documents/JRM_CV.pdf‎

6 Bytes
Binary file not shown.

‎documents/JRM_CV.tex‎

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -755,23 +755,23 @@ \subsection*{Mentorship (selected)}
755755
\item Abe Lobsenz (2026 -- )
756756
\item Katherina Cohen (2026 -- )
757757
\item Pattapol ``Phoom'' Sirimangklanurak (2026 -- )
758-
\item Malique Auguste (2026 -- ) \item Ahmad Wahab (2026 -- )
759-
\item Andy Kim (2026 -- )
758+
\item Malique Auguste (2026 -- ) \item Ahmad Wahab (2026)
759+
\item Andy Kim (2026)
760760
\item Isaac Cheon (2026 -- )
761761
\item Jason Kang (2026 -- )
762762
\item Mak Kelly (2026 -- )
763763
\item Miles McDonald (2026 -- )
764764
\item Theo Larson (2026 -- )
765-
\item Aidan Miller (2025 -- )
765+
\item Aidan Miller (2025 -- 2026)
766766
\item Alexandra Wingo (2025 -- )
767767
\item Alishba Tahir (2025 -- )
768768
\item Andrew Richardson (2025 -- 2026)
769769
\item Angelyn Liu (2025 -- )
770770
\item Annabelle Morrow (2025 -- 2026)
771771
\item Azaire Andre (2025 -- )
772-
\item Ben Hanson (2025 -- )
772+
\item Ben Hanson (2025 -- 2026)
773773
\item Colson Duncan (2025 -- )
774-
\item Ellie Mattox (2025 -- )
774+
\item Ellie Mattox (2025 -- 2026)
775775
\item Emmy Thornton (2025)
776776
\item Evan McDermid (2025 -- 2026)
777777
\item Jackson C. Sandrich (2025 -- 2026)
@@ -782,7 +782,7 @@ \subsection*{Mentorship (selected)}
782782
\item Luca Gandrud (2025 -- 2026)
783783
\item Owen Phillips (2025 -- 2026)
784784
\item Rodrigo Vega Ayllon (2025)
785-
\item Sam Haskel* (2025 -- )
785+
\item Sam Haskel* (2025 -- 2026)
786786
\item Will Lehman (2025 -- )
787787
\item Abigayle McCusker (2024)
788788
\item Andrew Cao (2024)
@@ -811,16 +811,16 @@ \subsection*{Mentorship (selected)}
811811
\item Grace Wang (2023)
812812
\item Grady Redding (2023 -- 2024)
813813
\item Jake McDermid (2023 -- 2025)
814-
\item Jennifer Xu (2023 -- )
814+
\item Jennifer Xu (2023 -- 2026)
815815
\item Maura Hough (2023 -- 2024)
816816
\item Megan Liu (2023 -- 2024)
817817
\item Michael Chen (2023 -- 2024)
818818
\item Mira Chiruvolu (2023 -- 2024)
819819
\item Natalie Schreder (2023)
820-
\item Om Shah (2023 -- )
820+
\item Om Shah (2023 -- 2026)
821821
\item Raselas Dessalegn (2023)
822822
\item Safwan Rashid (2023)
823-
\item Sarah Parigela (2023 -- )
823+
\item Sarah Parigela (2023 -- 2026)
824824
\item Sergio Campos Legonia (2023)
825825
\item William McCall (2023)
826826
\item Xueyao Zheng (2023)

‎lab-manual‎

‎people.html‎

Lines changed: 15 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -97,29 +97,6 @@ <h3><a href="https://contralto.github.io/" target="_blank">claudia gonciulea</a>
9797
</div>
9898

9999
<div class="people-grid">
100-
<div class="person-card">
101-
<img src="images/people/jennifer_xu.png" alt="jennifer xu">
102-
<h3>jennifer xu | undergrad</h3>
103-
<p>Jennifer is a Mathematical Data Science major. She is fascinated by understanding how machines "think," whether in biological neural networks or large language models. In her spare time, she enjoys watching videos of tech reviews of mice and keyboards.</p>
104-
</div>
105-
<div class="person-card">
106-
<img src="images/people/om_shah.png" alt="om shah">
107-
<h3>om shah | undergrad</h3>
108-
<p>Om is a member of the class of 2026 from Morganton, NC. He is on the pre-med track, and has many different interests ranging from biology to computer science.</p>
109-
</div>
110-
<div class="person-card">
111-
<img src="images/people/sarah_parigela.png" alt="sarah parigela">
112-
<h3>sarah parigela | undergrad</h3>
113-
<p>Sarah is a Cognitive Science and Biomedical Engineering double major interested in translating brain research into real-world diagnostics. When she doesn't have her nose in a book, she's working as an EMT or convincing high schoolers that science is cool.</p>
114-
</div>
115-
</div>
116-
117-
<div class="people-grid">
118-
<div class="person-card">
119-
<img src="images/people/aidan_miller.png" alt="aidan miller">
120-
<h3>aidan miller | undergrad</h3>
121-
<p>Aidan is a pre-med student at Dartmouth College, majoring in Biology, minor in Spanish, and graduating in 2028. He joined the Contextual Dynamics Lab in fall 2025, where his interests center on advanced learning and memory techniques, including the method of loci and PAO systems.</p>
122-
</div>
123100
<div class="person-card">
124101
<img src="images/people/alexandra_wingo.png" alt="alexandra wingo">
125102
<h3>alexandra wingo | undergrad</h3>
@@ -130,50 +107,32 @@ <h3>alexandra wingo | undergrad</h3>
130107
<h3>alishba tahir | undergrad</h3>
131108
<p>Alishba is a visiting research assistant interested in the intersection of memory, narrative processing, and the mechanisms behind forgetting what to forget. She holds an undergraduate degree in Biology from LUMS and has previously worked on fMRI-based disease analysis. At the CDL, she is exploring how recall and prediction shape memory dynamics over time using naturalistic stimuli.</p>
132109
</div>
133-
</div>
134-
135-
<div class="people-grid">
136110
<div class="person-card">
137111
<img src="images/people/angelyn_liu.png" alt="angelyn liu">
138112
<h3>angelyn liu | undergrad</h3>
139113
<p>Angelyn is a member of the class of 2028 from the Bay Area, CA, planning on majoring in cognitive science. In her free time, she enjoys singing, reading, puzzle games, and creative writing.</p>
140114
</div>
141-
<div class="person-card">
142-
<img src="images/people/azaire_andre.png" alt="azaire andre">
143-
<h3>azaire andre | undergrad</h3>
144-
<p>Azaire is a Dartmouth student studying mathematics and anthropology, with interests in health equity, education, and community leadership. She enjoys swimming and cheering, and is actively involved in campus organizations that support mentorship and inclusion.</p>
145-
</div>
146-
<div class="person-card">
147-
<img src="images/people/ben_hanson.png" alt="ben hanson">
148-
<h3>ben hanson | undergrad</h3>
149-
<p>Ben is a member of the class of 2027 studying PPE and human-centered design. Outside of school, he enjoy skiing, surfing, and coffee.</p>
150-
</div>
151115
</div>
152116

153117
<div class="people-grid">
154118
<div class="person-card">
155-
<img src="images/people/ellie_mattox.png" alt="ellie mattox">
156-
<h3>ellie mattox | undergrad</h3>
157-
<p>Ellie is a member of the class of 2027 from Austin, TX and is majoring in neuroscience with a minor in human-centered design. Outside of the lab she enjoys playing volleyball on Dartmouth's Varsity team, spending time outside, and hanging out with friends.</p>
158-
</div>
159-
<div class="person-card">
160-
<img src="images/people/sam_haskel.png" alt="sam haskel">
161-
<h3>sam haskel | undergrad</h3>
162-
<p>Sam is a double major in Quantitative Social Science and Economics, interested in how social peer influences shape beliefs and affect decision-making. He enjoys playing sports, spending time outdoors, and hanging out with friends and family.</p>
119+
<img src="images/people/azaire_andre.png" alt="azaire andre">
120+
<h3>azaire andre | undergrad</h3>
121+
<p>Azaire is a Dartmouth student studying mathematics and anthropology, with interests in health equity, education, and community leadership. She enjoys swimming and cheering, and is actively involved in campus organizations that support mentorship and inclusion.</p>
163122
</div>
164123
<div class="person-card">
165124
<img src="images/people/will_lehman.png" alt="will lehman">
166125
<h3>will lehman | undergrad</h3>
167126
<p>Will is a '27 from Salt Lake City, Utah. He likes skiing, playing hockey, and working on new projects.</p>
168127
</div>
169-
</div>
170-
171-
<div class="people-grid">
172128
<div class="person-card">
173129
<img src="images/people/theo_larson.png" alt="theo larson">
174130
<h3>theo larson | undergrad</h3>
175131
<p>Theo is a '29 from Brooklyn, New York and a prospective major in Economics and History. In his free time, he enjoys reading, playing board games, and taking walks with his dog Sunny.</p>
176132
</div>
133+
</div>
134+
135+
<div class="people-grid">
177136
<div class="person-card">
178137
<img src="images/people/jason_kang.png" alt="jason kang">
179138
<h3>jason kang | undergrad</h3>
@@ -184,24 +143,11 @@ <h3>jason kang | undergrad</h3>
184143
<h3>mak kelly | undergrad</h3>
185144
<p>Mak, a '28 math and computer science major, is interested in entrepreneurship and plays rugby for Dartmouth.</p>
186145
</div>
187-
</div>
188-
189-
<div class="people-grid">
190146
<div class="person-card">
191147
<img src="images/people/isaac_cheon.png" alt="isaac cheon">
192148
<h3>isaac cheon | undergrad</h3>
193149
<p>Isaac is a pre-dental student majoring in Computer Science. He enjoys playing drums and spending time outdoors.</p>
194150
</div>
195-
<div class="person-card">
196-
<img src="images/people/ahmad_wahab.png" alt="ahmad wahab">
197-
<h3>ahmad wahab | undergrad</h3>
198-
<p>Ahmad, a Dartmouth '27 student, studies computer science and neuroscience, focusing on applying technology to solve real-world healthcare issues. In his free time, he enjoys rock climbing.</p>
199-
</div>
200-
<div class="person-card">
201-
<img src="images/people/andy_kim.png" alt="andy kim">
202-
<h3>andy kim | undergrad</h3>
203-
<p>Andy is a prospective QSS major from Seoul, South Korea. He has many academic interests involving decision-making, learning, neurodivergence, the market, and theatre. Outside of classes he works as a Tech for Collis and dances in his hip-hop dance group Street Soul.</p>
204-
</div>
205151
</div>
206152

207153
<div class="people-grid">
@@ -342,8 +288,13 @@ <h3>Lab Managers</h3>
342288
<div>
343289
<h3>Undergraduate Researchers</h3>
344290
<p class="alumni-list">
291+
Ahmad Wahab (2026)<br>
292+
Andy Kim (2026)<br>
293+
Aidan Miller (2025-2026)<br>
345294
Andrew Richardson (2025-2026)<br>
346295
Annabelle Morrow (2025-2026)<br>
296+
Ben Hanson (2025-2026)<br>
297+
Ellie Mattox (2025-2026)<br>
347298
Emmy Thornton (2025)<br>
348299
Evan Mcdermid (2025-2026)<br>
349300
Jackson C. Sandrich (2025-2026)<br>
@@ -354,6 +305,7 @@ <h3>Undergraduate Researchers</h3>
354305
Luca Gandrud (2025-2026)<br>
355306
Owen Phillips (2025-2026)<br>
356307
Rodrigo Vega Ayllon (2025)<br>
308+
Sam Haskel (2025-2026)<br>
357309
Abigayle McCusker (2024)<br>
358310
Andrew Cao (2024)<br>
359311
Ansh Motiani (2024)<br>
@@ -381,13 +333,16 @@ <h3>Undergraduate Researchers</h3>
381333
Grace Wang (2023)<br>
382334
Grady Redding (2023-2024)<br>
383335
Jake McDermid (2023-2025)<br>
336+
Jennifer Xu (2023-2026)<br>
384337
Maura Hough (2023-2024)<br>
385338
Megan Liu (2023-2024)<br>
386339
Michael Chen (2023-2024)<br>
387340
Mira Chiruvolu (2023-2024)<br>
388341
Natalie Schreder (2023)<br>
342+
Om Shah (2023-2026)<br>
389343
Raselas Dessalegn (2023)<br>
390344
Safwan Rashid (2023)<br>
345+
Sarah Parigela (2023-2026)<br>
391346
Sergio Campos Legonia (2023)<br>
392347
William McCall (2023)<br>
393348
Xueyao Zheng (2023)<br>

‎scripts/offboard_member.py‎

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66
2. Prompts for selection if multiple matches found
77
3. Moves member from 'members' sheet to 'alumni_undergrads' sheet
88
4. Updates JRM_CV.tex to add end date to the member's entry
9-
5. Rebuilds people.html
9+
5. Moves them to alumni in the lab-manual submodule and pushes it
10+
6. Rebuilds people.html and the CV (skip with --skip-rebuild)
1011
1112
Idempotent: Running twice with same name will detect already-offboarded member.
1213
@@ -25,6 +26,8 @@
2526

2627
import openpyxl
2728

29+
from onboard_member import rebuild_pages
30+
2831

2932
def get_project_root() -> Path:
3033
return Path(__file__).parent.parent
@@ -213,7 +216,10 @@ def list_undergrads_without_photos(xlsx_path: Path) -> None:
213216

214217

215218
def offboard_member(
216-
search_name: str, end_year: Optional[str] = None, skip_confirm: bool = False
219+
search_name: str,
220+
end_year: Optional[str] = None,
221+
skip_confirm: bool = False,
222+
skip_rebuild: bool = False,
217223
) -> bool:
218224
project_root = get_project_root()
219225
xlsx_path = project_root / "data" / "people.xlsx"
@@ -287,9 +293,13 @@ def offboard_member(
287293
except Exception as e:
288294
print(f" WARNING: Could not update lab-manual: {e}")
289295

290-
print(f"\nSuccessfully offboarded {member['name']}")
291-
print("Run 'python build.py' to rebuild people.html")
296+
# Same rebuild onboarding runs, so neither script leaves people.html or
297+
# the CV PDF/HTML stale behind the sources it just edited.
298+
if not skip_rebuild and not rebuild_pages(project_root):
299+
print(f"\nOffboarded {member['name']} in the sources, but a rebuild failed (see above)")
300+
return False
292301

302+
print(f"\nSuccessfully offboarded {member['name']}")
293303
return True
294304

295305

@@ -303,6 +313,7 @@ def main():
303313
python offboard_member.py "john" --end-year 2024
304314
python offboard_member.py --list-no-photo
305315
python offboard_member.py "jane" -y # Skip confirmation
316+
python offboard_member.py "jane" -y --skip-rebuild # Batch; build once after
306317
""",
307318
)
308319

@@ -317,6 +328,11 @@ def main():
317328
parser.add_argument(
318329
"-y", "--yes", action="store_true", help="Skip confirmation prompt"
319330
)
331+
parser.add_argument(
332+
"--skip-rebuild",
333+
action="store_true",
334+
help="Skip rebuilding people.html and the CV",
335+
)
320336
parser.add_argument(
321337
"--list-no-photo",
322338
action="store_true",
@@ -336,7 +352,7 @@ def main():
336352
parser.print_help()
337353
sys.exit(1)
338354

339-
success = offboard_member(args.name, args.end_year, args.yes)
355+
success = offboard_member(args.name, args.end_year, args.yes, args.skip_rebuild)
340356
sys.exit(0 if success else 1)
341357

342358

‎scripts/parse_lab_manual.py‎

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -401,13 +401,16 @@ def move_member_to_alumni(tex_path, name, end_year):
401401
# '\item Caroline Lee (2019 -- 2021)\end{list}' -- leaving the list
402402
# unterminated and the manual unbuildable.
403403
item_match = re.search(
404-
r'(?m)^[^%\n]*?\\item\s+' + re.escape(name) + r'\*?\s*\((\d{4})\s*--\s*\)',
404+
r'(?m)^[^%\n]*?\\item\s+(' + re.escape(name) + r')\*?\s*\((\d{4})\s*--\s*\)',
405405
section, re.IGNORECASE
406406
)
407407
if not item_match:
408408
raise ValueError(f"Could not find '{name}' in Current lab members section")
409409

410-
start_year = item_match.group(1)
410+
# Callers pass the spreadsheet's lowercase name; the manual's own
411+
# spelling is what goes back in.
412+
manual_name = item_match.group(1)
413+
start_year = item_match.group(2)
411414

412415
headings = [h for h in _HEADING_RE.finditer(section) if h.start() < item_match.start()]
413416
if not headings:
@@ -430,7 +433,10 @@ def move_member_to_alumni(tex_path, name, end_year):
430433
)
431434
alumni_section = content[alumni_start:alumni_end]
432435

433-
alumni_item = f'\\item {name} ({start_year} -- {end_year})'
436+
# A one-year stint is written '(2019)', never '(2019 -- 2019)'.
437+
years = (start_year if str(end_year) == start_year
438+
else f'{start_year} -- {end_year}')
439+
alumni_item = f'\\item {manual_name} ({years})'
434440
alumni_block = _find_role_block(alumni_section, role_category)
435441
if not alumni_block:
436442
new_alumni = _insert_role_block(alumni_section, role_category, alumni_item)

0 commit comments

Comments
 (0)