CLAUDE.md

Jekyll personal site, deployed by GitHub Pages from master. Ruby is pinned to 3.4.5 (.ruby-version); the bundle will not resolve on Ruby 4.x.

bundle exec jekyll serve -l

Research pages

research/<slug>/index.html is generated. Never edit it by hand — your edit will be overwritten. Edit research/<slug>/_research.md and regenerate:

bundle exec ruby _script/build-research.rb <slug>

The repo is public, so _research.md is gitignored — the generator encrypts it client-side (AES-256-GCM, PBKDF2) into the committed _research.md.enc and into index.html itself. It needs a passphrase: RESEARCH_KEY env var, else the gitignored .research-key file at the repo root; the real passphrase lives in a password manager, not in this repo. On a fresh clone, recover the markdown from the committed .enc file:

bundle exec ruby _script/build-research.rb --decrypt <slug>

Commit index.html and _research.md.enc, never _research.md.

Before writing or editing any research page, use the research-page skill. It carries the markdown conventions — callouts, legal quotes, checklists, section ids and cross-references — that produce the callouts and the sidebar contents. Plain markdown builds, but silently loses all of that.

Keep prose in the markdown. Presentation belongs in _script/research-template.html, which all research pages share.

Conventions

Files and directories starting with _ are invisible to Jekyll at any depth — that is how _research.md, _artifacts/ and _script/ stay unpublished. Do not add an exclude: key to _config.yml to hide things: it replaces Jekyll’s default exclude list rather than extending it, which publishes the Gemfile.

Pages under research/ are kept out of sitemap.xml by the defaults: block in _config.yml and carry a noindex meta tag.