Make the plain page (public/resume.html) a generated declared mirror so it and
the terminal share one source, and enrich that source to the superset both need.
- resume.org: merged to the superset — richer achievement-oriented bullets,
per-item subtitle/location/tech tags, all projects (adds Terrapin Rocket,
Robotics@UMD) and the full course list.
- org-to-json parser: optional subtitle/location fields + `- tech :: X` tagged
bullets; `list` flag so education stays bullet-free; empty tag arrays dropped.
- scripts/build-resume-html.mjs + resume.template.html: the template owns the
design (unchanged look); content is rendered from resume.json. Adds a global
search box that filters every card and course pill across sections, with a
no-results empty state. HTML-escaped; arXiv ids linkified.
- resume:build now generates both mirrors; resume:check + CI canary verify both.
Verified: yarn build + tsc clean; both canaries green; driven headless — design
preserved, 17 cards render, search isolates by keyword/tech/course, no errors.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Nt6ycjAMdUMqGTGtbKocrs
Establish the canonical résumé authoring layer, the heart of the MiTerm
redesign toward a single source of truth.
- resume.org: canonical résumé as org-roam nodes (one :ID: heading per
experience/project/education/org/publication item + profile + skills).
- scripts/org-to-json.mjs: contract-first, dependency-free parser that emits
a deterministic resume.json declared mirror; --check is the drift canary.
- resume.json: generated mirror consumed (next phase) by the terminal and the
plain résumé page.
- prebuild/predev generate the mirror; .github/workflows/resume-canary.yml
fails CI when resume.json drifts from resume.org.
- docs/decisions/0001: MADR record of the source/pipeline/topology/minimalism
decisions. docs/resume-pipeline.org: reference + mirror table.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Nt6ycjAMdUMqGTGtbKocrs