AGENTS.md β Whiting.me
AGENTS.md β Whiting.me
Mark E. Whitingβs personal website: a Jekyll site deployed to GitHub Pages using the Minima theme with custom styling. Content includes the homepage, bio, an academic CV, FAQ, and blog posts.
This file is the primary orientation for AI coding agents working in this repo. Read it first; only fall back to broader searches when something here is missing or contradicted by what you find.
Quick reference
- Stack: Jekyll (Ruby) + Minima theme + custom SCSS, plus Node-based Playwright-style integration tests.
- Deploy target: GitHub Pages (custom domain via
CNAME). - Ruby: 3.2 (matches CI).
- Node: any recent LTS is fine for running
npm test.
Working effectively (local, macOS)
Install and build:
bundle config set --local path 'vendor/bundle'
bundle install # ~30s the first time β do not cancel; allow 90s+
bundle exec jekyll build # ~2s
Run the dev server:
bundle exec jekyll serve --host 0.0.0.0 --port 4000
# http://localhost:4000 β Ctrl+C to stop
If bundler itself is missing: gem install --user-install bundler and make sure the user gem bin dir is on PATH.
Tests
There is a Node-based test suite under tests/ (driven via package.json). These are integration checks that hit a running site, so start jekyll serve first, then in another shell:
npm test # runs all suites in order
npm run test:urls # url-collision-test.js
npm run test:basic # basic-test.js
npm run test:footer # footer-test.js
npm run test:cv # cv-test.js
npm run test:print # print-styles-test.js
npm run test:colors # color-space-test.js
Reports land in playwright-report/ (gitignored / build artefact β do not commit). When fixing a failing test, prefer fixing the site/content over loosening the assertion.
Validation checklist
After any non-trivial change, run through this before handing the change back:
bundle exec jekyll buildsucceeds with no errors/warnings.bundle exec jekyll servestarts cleanly.- Visit the key pages and confirm they render:
/(homepage)/bio//cv//faq//posts/(archive)
- Navigation links between those pages work.
- If you touched anything under
tests/scope (CV, footer, print styles, colors, URLs, general layout), run the relevantnpm run test:*suite. - No broken images or obviously missing assets.
Repository layout
.
βββ _config.yml # Jekyll configuration (permalink: /:title/)
βββ Gemfile / Gemfile.lock
βββ package.json # Node test runner scripts
βββ index.md # Homepage
βββ bio.md # Bio page
βββ cv.html # CV page (renders _data/CV.csv)
βββ faq.md # FAQ page
βββ posts.html # Post archive
βββ bib.html, chat.html, feedback.html, goals.html, meet.html, 404.html
βββ _posts/ # Blog posts: YYYY-MM-DD-title.markdown
βββ _layouts/ # Page templates (default.html, post.html, ...)
βββ _includes/ # Reusable partials
βββ _sass/ # SCSS overrides on top of Minima
βββ _data/ # Structured content (CV.csv, mentees.yml, ...)
βββ assets/ # Images, CSS, JS
βββ tests/ # Node integration tests
βββ .github/workflows/ # CI (Jekyll build + Pages deploy)
βββ old/ # Legacy/archived content β do not rely on or modify without reason
βββ vendor/, node_modules/, _site/, .sass-cache/, playwright-report/ # all build/output, gitignored
Key config
_config.yml sets the site metadata, permalink: /:title/ (clean title-based URLs), theme: minima, and plugins jekyll-feed and jekyll-sitemap. If you add a plugin, add it both here and to the Gemfile.
Gemfile uses github-pages (so local versions track what Pages builds with), plus minima, jekyll-feed, and webrick.
Content conventions
Blog posts
- Live in
_posts/and must be namedYYYY-MM-DD-title.markdown. - Require YAML front matter with at least
title,date, andcategories. - Final URL is
/:title/(set globally), so keep the slug portion unique and URL-safe. - When adding a post, consider running
npm run test:urlsto catch collisions with existing pages.
Pages
- New top-level pages can be
.mdor.htmlat the repo root. - Use
layout:front matter to pick a layout from_layouts/. - Prefer Markdown for text-heavy pages and HTML for pages with structural/layout logic (as
cv.htmlandbib.htmldo).
Styling
- Customisations live in
_sass/; donβt edit the Minima gem directly. - Print styles are exercised by
tests/print-styles-test.jsβ validate there after print-related tweaks. - Color-space assumptions are exercised by
tests/color-space-test.js.
CV data authoring (_data/CV.csv)
The CV template renders each row as:
{position} [in {focus}] at {institutionFull} ({institutionShort}) {notes}
institutionFull is always the host/parent body β the organisation or conference that is ultimately responsible for the event. Specific event details belong in position or focus, never in institutionFull.
Field usage by case
| Case | position | focus | institutionFull | institutionShort | notes |
|---|---|---|---|---|---|
| Simple role at an org | Senior Scientist |
β | University of Pennsylvania |
U Penn |
extra detail |
| Role at a sub-event of a conference | Panelist at AAAI 2025 Workshop on A Translational Institute for Knowledge Axiomatization |
β | The 39th Annual AAAI Conference on Artificial Intelligence |
AAAI |
β |
| Role within a track at a conference | Doctoral Colloquium Mentor |
β | AAAI Conference on Human Computation and Crowdsourcing |
HCOMP |
β |
| Role in a specific chapter/sub-group | Participant |
the Duke chapter |
Summer Institute in Computational Social Science |
SICSS |
β |
| Role at a workshop hosted by an external org | Panelist at the Changing Nature of Work Workshop |
β | Center for Work Technology and Organization |
WTO |
at Stanford University |
Key rules
- Never put a workshop or sub-event name as
institutionFull. Put it inpositioninstead (e.g.Panelist at [Workshop Name]). institutionShortis the abbreviation ofinstitutionFull(the host), never of the sub-event or workshop. Never include the year (useAAAI, notAAAI-25).focusis only for a sub-track/chapter/specialisation within the institution (rendered asin {focus}).notesis for extra location or context that doesnβt fit the main pattern (e.g.at Stanford University). Donβt use it to re-state the institution or workshop.- Date range: if
dateStartanddateEndare in the same calendar year, only that year shows. IfdateEndis empty, an arrow (β) indicates ongoing. For one-off events, setdateEnd = dateStartto avoid the arrow.
After editing CV.csv, run npm run test:cv against a running dev server.
CI/CD
- Workflow:
.github/workflows/jekyll.yml. - Triggered on push (see the workflow for the exact branch).
- Uses
ruby/setup-ruby@v1with Ruby 3.2 and bundler caching. - Build command:
bundle exec jekyll build --future(note--futureβ scheduled future-dated posts are included). - Deploy:
actions/deploy-pages@v4to GitHub Pages. - Jobs: build, deploy, test.
If something builds locally but fails in CI, first check the Ruby/bundler versions and whether a gem is missing from the Gemfile (local vendor/bundle can hide that).
Troubleshooting
bundle installpermission errors: use--user-installfor bundler, and make sure the user gembinis onPATH. Project gems always install undervendor/bundle/thanks to the local bundler config.- Port 4000 in use:
bundle exec jekyll serve --port 4001. - Build errors: almost always a YAML front-matter typo in a post/page, or an unclosed Liquid tag.
- Broken styling: check recent edits in
_sass/; make sure SCSS compiles and doesnβt shadow a Minima partial by accident. - Tests failing locally: confirm the dev server is actually running on
http://localhost:4000and that youβre not hitting a stale_site/from a previous branch (delete_site/and rebuild if unsure).
Expected timings
bundle install(cold): ~30s β do not cancel; allow 90s+.bundle install(warm): seconds.bundle exec jekyll build: ~2s.bundle exec jekyll servestartup: 2β3s.- Full
npm testsuite: well under a minute against a running local server. - CI end-to-end: 1β2 minutes.
Conventions for agents
- Donβt commit generated output.
_site/,vendor/,node_modules/,.sass-cache/,playwright-report/are all build artefacts. - Donβt modify
old/unless the task is explicitly about it. Itβs archival. - Keep commits scoped. Content edits, layout/style changes, and test changes are three different kinds of change; keep PRs/commits coherent.
- Prefer editing over rewriting. Especially for
_layouts/,_includes/, and_sass/, small diffs are much easier to review than wholesale rewrites. - When in doubt about CV formatting, re-read the βCV data authoringβ section above before guessing.