An umbrella website built with Astro + Starlight and deployed to GitHub
Pages as a user site (bryanpcutsinger.github.io, served at the root). One repo:
/,/about/,/speaking/,/contact/— the professional marketing site (custom Astro pages insrc/pages/, NOT Starlight). Built out 2026-06-14 — see the Marketing site section below. This is now the primary front end./ai/— Getting Started with Codex: a beginner's guide to getting started with Codex, written for academic economists on a Mac who are new to the command line and AI tools. Framed as a LEAN pre-read (see the Goal below): a short required path of 8 pages (orientation + set up + get oriented) that gets a reader self-sufficient, with the other 9 posts demoted to a collapsed "Reference (for after)" group — good material, but for when a topic comes up, not pre-read. (Framed for an economist audience — examples draw on teaching economics and doing economic research, balanced roughly evenly. Stay beginner-friendly: the reader is a fellow economist new to these tools, not a developer. Keep new content in this academic-economist register.)- Goal / guiding lens (2026-06-13): the site exists to get a reader self-sufficient
on setup and the core mental model on their own, so any in-person/hands-on time is
spent on real work, not basics. Public-facing framing (no "our session" language),
but every page is judged by: does it help the reader arrive ready? Bias toward a
lean required path; resist scope creep back into the reference pile. Audit + revision
plan:
~/.Codex/plans/crystalline-rolling-jellyfish.md.
Future sub-sites get added as new Starlight content groups in the same repo.
The root is a bespoke, conversion-grade marketing site positioning Bryan as an
economist + paid speaker, built as custom Astro pages in src/pages/
(index, about, speaking, contact, writing, research, plus teaching/*),
completely separate from Starlight (which still owns /ai/).
⚠️ REDESIGNED 2026-07-01 → the "public economist" system (LIVE, commit369cf5f). The brass/bone and Fraunces+Inter descriptions in this section — and a since-superseded interim claret "public essay" system — are HISTORY. The live look is now outward-first: bright paper + deep ink + one ledger-green accent, a two-face pairing (Fraunces display + Newsreader reading + Inter labels). See the "Public economist redesign" bullet below and the top Current status entry. Earlier history:~/.Codex/plans/i-want-to-rebuilt-ancient-zephyr.md(Rev 1–5) and~/.Codex/plans/let-s-try-another-approach-async-knuth.md(the 2026-07-01 rebuild).
- Brand — "the public economist" (2026-07-01, current): bright archival paper
#FBFAF7+ warm ink#1A1917+ one ledger-green accent#22453B(on-ink variant#B8D0C6; hard rule — never green on the ink header/footer, 1.66:1). Type is a two-face pairing: Fraunces (display voice) + Newsreader (reading prose) + Inter (labels/nav/data), all reusing fonts already inpackage.json(no new font deps). Tokens:src/styles/site.css(loaded byMarketingLayoutafter the legacybrand.css, whose shared tokens it overrides via aliases;brand.css= the superseded claret system, kept loaded only until Teaching is migrated). The two CSS systems never touch —site.css/brand.cssload only onsrc/pages/;fau-theme.cssonly inside Starlight. Accent hue is a token knob (green default; ink-blue/graphite noted). - Layout/kit:
src/layouts/MarketingLayout.astro(own<head>, sticky nav, footer,noindexprop defaulttrue, sitewidePersonJSON-LD) +src/components/marketing/*. New primitives:DatedList(dated record; year in accent tabular figures; stacks <640px),EmailCapture(graceful mailto fallback),PageHead(interior-page masthead),CloseBand(in-system ink CTA, replaces the claretColophon),CitationList(bibliography; year folio).Buttongained anon-inkvariant. Reused:Section,BookingForm,DownloadCard. Editable copy:src/data/{topics, testimonials,logos,writing,publications}.json. Home is outward-first — masthead + positioning line, proof strip, signature talks as outcomes, an ink invite band with a fee signal, the Codex guide as a hook, a Recent list, email capture, and a departments router. Claret-era components (ClaretOpener,Colophon,EditorialIndex,PageMasthead) are now unused dead files pending cleanup. - Photos in
src/assets/:bryan-cutsinger.png(headshot → hero/about), pluson-stage-podium.jpg(home "Bryan in the room" reel),on-stage-gesturing.jpg(about),speaking-hero.jpg(speaking hero). Optimized viaastro:assets. - Nav order (2026-07-01):
Speaking · Writing · Research · Teaching · Guides · About · Contact(Speaking promoted to slot 1) acrossSiteHeader,SiteFooter, and theHeaderLinksoverride. On-ink surfaces use the--accent-on-inkvariant for hover/active (never green on ink). Sitemap: explicit@astrojs/sitemapinastro.config.mjscovers thesrc/pages/routes. /ai/guides share the marketing site's FULL visual language — retuned 2026-07-01 to the "public economist" system:fau-theme.cssmaps paper/ink/ledger-green onto Starlight's ramp; Fraunces headings, Newsreader prose, Inter UI, IBM Plex Mono code (loaded viaSiteTitle.astro, whose wordmark is now Fraunces). Sentence-case headings, minimal hairline tables, lift-on-hover cards, green note-callouts. The only intentionally-distinct thing is the Starlight docs layout (sidebar/TOC).- LIVE (redesign deployed 2026-07-01, commit
369cf5f); stillnoindexed.
Placeholders Bryan still owes (marked [PLACEHOLDER] in code; all noindex, but
publicly viewable by link on the live site): real essay/press
URLs (data/writing.json — Writing page); the home Recent list (literals in
index.astro); Web3Forms access key + booking email (booking form inert until then —
BookingForm.astro) and a list provider for EmailCapture (mailto fallback until then);
speaker one-sheet PDF + a video reel (Speaking's
paid-speaking launch gate: at least one on-stage photo + short clip before lifting noindex);
testimonials (testimonials.json empty → section auto-hidden; named quotes only);
sameAs profile URLs for the Person JSON-LD (Scholar/ORCID/SSRN). Already real: talk
topics (data/topics.json), short + long bio + credentials (about.astro), publications
(data/publications.json — Research page; GENERATED from the CV since 2026-07-15, see the
CV section; 12 articles + 3 chapters + 1 book in press + 4 under review + 3 working papers,
no DOIs yet — the CV carries none), and the CV PDF (import:cv pipeline — see
below). Verified facts
only: "Featured in" = National Review, The Hill, The Washington Examiner, RealClearEducation;
credentials = interim director of the AIER Sound Money Project, Associate Editor of
Public Choice, FAU economics professor (WSJ was a letter to the editor — not featured).
Integrity: never fabricate a citation, DOI, essay URL, testimonial, or sameAs.
- Astro 5 + Starlight (
@astrojs/starlight@^0.36). Static output, user site, nobasepath. Starlight owns the layout, sidebar, right-rail TOC, prev/next pager, and search.- Starlight is pinned to the 0.36 line on purpose: 0.38+ requires Astro 6 and we're staying on Astro 5 for now (see TODO). Don't bump it without bumping Astro.
- Theming = the "public economist" brand (retuned 2026-07-01; was FAU→brass→claret).
src/styles/fau-theme.css(registered via StarlightcustomCss) carries the full marketing brand onto Starlight — palette/type (paper#FBFAF7+ ink#1A1917+ one ledger-green#22453Baccent; Fraunces headings, Newsreader prose, Inter UI, IBM Plex Mono code) and its patterns: sentence case throughout, minimal hairline tables, lift-on-hover cards, green underlined links, green note-callouts. The filename and its--fau-*variable names are historical — they hold the current brand colors, not FAU's (and not the interim brass/claret). Marketing tokens:src/styles/site.css(the current system);src/styles/brand.cssis the superseded claret system, still loaded first so not-yet-migrated pages keep working — retire it once Teaching is migrated. Redesign plan:~/.Codex/plans/let-s-try-another-approach-async-knuth.md. - Content lives in
src/content/docs/(Starlight'sdocscollection, defined insrc/content.config.tsviadocsLoader()+docsSchema()):docs/index.mdx→/(splash landing)docs/ai/index.mdx→/ai/(overview: stage cards + "What you'll need" table)docs/ai/<slug>.md→/ai/<slug>/(the 17 guide posts; flat slugs)public/templates/Codex-md-economist-template.md→/templates/...(a downloadable economist AGENTS.md starter, linked fromCodex-md-and-memory.md)
- Frontmatter is Starlight's (
title,description,draft, optionallytemplate/hero/sidebar). NopubDate/tags— curriculum ORDER lives in the sidebar config, not dates. - Sidebar / curriculum order lives in the GUIDE repo (
guide.manifest.jsoninbryanpcutsinger/Codex-guide), NOT inastro.config.mjsanymore (changed 2026-06-17 — see the "Codex guide" section below). The config just doesimport claudeGuideSidebar from './src/data/guide-sidebar.json'(a generated copy) andsidebar: [claudeGuideSidebar]. To add/reorder a post or restore the nested Start here → Set up → Get oriented → Reference (for after) groups, edit the manifest in the guide repo and re-import — never hand-edit the config or the generated JSON. Draft-safety rule still applies: the manifest lists onlydraft:falseposts (Starlight fails the build on draft/missing slugs). - The path is DE-NUMBERED. The original 10 posts used to hard-code "Step N" in prose; that was removed in the 2026-06-13 reframe (it broke once pages were resequenced/demoted). All posts now open topically and reference prerequisites by link, relying on Starlight's pager/breadcrumbs. Keep that convention — never reintroduce a global "Step N" label.
- Reference pages carry a banner. Each of the 9 demoted posts opens with a
:::note"Reference — for when you're up and running…" aside so it reads as optional. Add the same banner to any future Reference post. - Chrome overrides in
src/components/overrides/:SiteTitle.astro("Bryan Cutsinger" wordmark on the ink bar — own identity, NO FAU logo; also loads the Fraunces/Inter fonts site-wide via its frontmatter imports),Footer.astro(wraps Starlight's default Footer to preserve the pager, then adds an ink copyright bar — don't replace it outright), andHeaderLinks.astro(registered asSocialIcons; adds About/Speaking/Contact links back to the marketing site). - Safety/screenshot callouts use Starlight asides (
:::note/:::caution/:::danger). Screenshot placeholders are:::note[Screenshot to add]blocks — Bryan still needs to capture and insert real images.
npm run dev— local preview at http://localhost:4321 (use this to review)npm run build— production build intodist/npm run preview— serve the built site
Build status:
npm run buildis GREEN. The marketing pages (src/pages/) build fine. The/ai/Codex guide is now imported frombryanpcutsinger/Codex-guide(see the "Codex guide" section below): the overview (ai/index.mdx),what-is-Codex,setting-up-Codex, andyour-first-sessionaredraft:falseand the sidebar is built from the imported manifest (src/data/guide-sidebar.json). The fuller structure is reintroduced by editing the manifest in the guide repo as posts are rebuilt and flipped todraft:false(onlydraft:falseposts go in the manifest, or Starlight fails the build).
Push to main → .github/workflows/deploy.yml builds and publishes to Pages.
No manual deploy step. LIVE at https://bryanpcutsinger.github.io (repo: GitHub
user site bryanpcutsinger/bryanpcutsinger.github.io, public).
- This repo is the ONLY publisher to the live site (single-publisher invariant).
Source repos feed in via the
import:*scripts (read overgh api); the live deploy then happens here:npm run import:*→npm run build→ commit/pushmain. The source repos never deploy to live —micro-principlesandprice-theoryeach carry a refusal guardrail in their ownAGENTS.md(added 2026-06-20; committed + pushed: microb9d714f, price7cea48d) telling the agent to decline any push/deploy-to-live request and redirect it here. Pushing source to those repos' own GitHub remotes is fine and expected — that's the importer's input; only live-deploy is blocked there. (Codex-guideis also import-fed but does not yet carry this guardrail.) - Pages source = "GitHub Actions" (
build_type: workflow). Set 2026-06-14 viagh api -X PUT .../pages -f build_type=workflow. It was previouslylegacy("deploy from branch"), which made GitHub auto-run its Jekyllpages-build-deploymentbuilder on every push — it choked on the.astrofrontmatter and failed every time (harmless: the Astro workflow is what actually served, but it spammed failure emails). Do NOT switch Pages back to branch mode or the failing Jekyll builds return. - The site is
noindexed while shared privately: aheadmeta inastro.config.mjs(covers/ai/) ANDMarketingLayout.astro'snoindexprop defaulttrue(coverssrc/pages/). To allow indexing at full launch, lift BOTH (comment-linked). - Non-blocking CI warning: Node 20 sub-actions deprecated (GitHub forces Node 24 ~June
2026) — bump
withastro/action/checkout versions later.
- A guide post: author it in the guide repo (
~/Projects/Codex-guide), NOT here — addposts/<slug>.mdwith Starlight frontmatter (title,description,draft: true), add{ "slug": "ai/<slug>" }toguide.manifest.jsonwhen ready (draft:false), push, then on the website runnpm run import:guide+npm run buildand commit the regenerated files. Frame it for an academic economist new to these tools — examples from teaching and research, balanced (syllabi, problem sets, lecture notes; data cleaning, replication, working papers, citations). Beginner-friendly, not developer-facing. Voice: practical, low-hype, second person. Never hand-editsrc/content/docs/ai/here — it's a generated copy. - A new sub-site: add content under
src/content/docs/<name>/, give it its ownsidebargroup inastro.config.mjs(and/or a splash index). It inherits the brand theme automatically.
/teaching/ is a marketing-styled sub-site (custom src/pages/, NOT Starlight),
separate from the /ai/ Starlight docs. Two layers:
- Static scaffold (committed 2026-06-17,
158f056):/teaching/landing (src/pages/teaching.astro+src/data/teaching.json) and the per-course homesrc/pages/teaching/microeconomics.astro. Nav links to/teaching/were added toSiteHeader,SiteFooter, and the StarlightHeaderLinksoverride.- Courses are scaffold, NOT imported. The course list/cards live HERE in
src/data/teaching.json(each card:title/description/audience/format/href) and each course home is a hand-authoredsrc/pages/teaching/<slug>.astro(copymicroeconomics.astro). Only the topics inside a course flow through the import pipeline. Adding a course = one card inteaching.json+ one page insrc/pages/teaching/. The course<slug>in the card'shrefMUST match thecoursearg passed toimport:topic(thesrc/content/courses/<course>/folder), or topics won't show under it. - As of 2026-06-18 (
c1cc97b): two course cards — Micro-Economic Principles (renamed from "Principles of Microeconomics"; URL slug staysmicroeconomics; real description) and Price Theory (/teaching/price-theory/, slugprice-theory). Price Theory does NOT use the topic-posts pipeline — it's a problem bank with its ownimport:problemspipeline (see "Price Theory — problem-bank pipeline" below).
- Courses are scaffold, NOT imported. The course list/cards live HERE in
- Topic-posts pipeline (the publishing machine): per-topic readers are imported
from the private repo
bryanpcutsinger/micro-principles— this public repo holds a generated, never-hand-edited copy. Edit the source post → re-import → site updates.
How to publish/refresh a topic:
npm run import:topic -- <topic-slug> [course] # e.g. t01-economic-way-of-thinking microeconomics
scripts/import-topic.sh (via gh, no local clone of the source needed): copies post.md
with the <!-- INSTRUCTOR NOTES … --> block stripped, rewrites relative figure refs
](figures/x.svg) → absolute ](/teaching/<course>/<slug>/figures/x.svg), and copies
figures/*.svg into public/teaching/<course>/<slug>/figures/. Cleaned posts land in
src/content/courses/<course>/<slug>/post.md (the courses content collection in
src/content.config.ts — lenient Zod schema; Starlight's docs is untouched).
🔴 Security — instructor notes are stripped at THREE layers (the public repo must never
carry them): (1) PRIMARY — the import script removes the block at copy time, so notes
never enter source/git history; (2) defense-in-depth — a path-scoped remark plugin
(stripCourseComments in astro.config.mjs, no-op outside /content/courses/, so /ai/
output is byte-unchanged) strips HTML comments at render; (3) a postbuild gate
(package.json) fails the build if INSTRUCTOR NOTES appears anywhere in dist.
Publish gate: topic pages render/route only when frontmatter status: approved in
the PRODUCTION build. astro dev also previews drafts (mirrors Starlight's draft:
behavior) with a "Draft preview" badge, so Bryan can read in-progress topics locally
without publishing them. As of 2026-10-09 the full 22-post course is approved
upstream and imported here (T1, T2, T3a/b, T4a/b/c, T5a/b, T6a/b, T7a/b, T8a/b, T9,
T10a/b, T11a/b, T12a/b — the one-per-lecture split; the legacy un-split folders
t03/t04/t06/t07/t08/t10/t11 upstream have no post.md and are not imported), so the
live topic index renders all 22. To refresh after an upstream edit, re-run
npm run import:topic -- <slug> microeconomics for the changed topics (or loop over
src/content/courses/microeconomics/), rebuild, and commit.
Rendering: src/pages/teaching/microeconomics/[topic].astro (getStaticPaths +
render()) — eyebrow band (course · T#), in-page TOC from ## claim headers, scoped
.prose CSS (incl. GFM tables + figure/caption styling), prev/next pager, back-link,
CTABand. The course home lists published topics as an ordered index. Slides are LaTeX and
on hold upstream → DownloadCards show "Request" until PDFs land in public/downloads/.
Note: in [topic].astro, getStaticPaths() runs in an isolated scope — keep the
consts it needs (COURSE, helpers) inside it; the template re-declares COURSE.
Price Theory is not topic readers — its source repo
bryanpcutsinger/price-theory (public) is a problem bank, so it uses a separate,
simpler pipeline from import:topic. The repo's own build (fetch_raw.py →
collect_problems.js → build.py) regenerates derived/problems.json (flattened
problems, each with inline provenance + topics[]/subtopics[]/exam_context/solution)
and taxonomy.json (13 topics, each with a label + allowed subtopics).
Refresh the bank: npm run import:problems (scripts/import-problems.sh, via gh)
pulls those two files into a generated, never-hand-edited committed copy at
src/data/price-theory/{problems,taxonomy}.json. No notes-strip / no figure copy (the
source is public + text-only); the script fails if the bank is empty/malformed.
Rendering (custom Astro pages reading the JSON, NOT the courses collection or the
Markdown pipeline):
src/pages/teaching/price-theory.astro— course home = the bank's front door: overview- a
TopicGridof the taxonomy topics that have ≥1 problem (sorted by count), each card →/teaching/price-theory/<topic-key>/, plus a client-side cross-bank search: free-text box + facet filters (topic, source, instructor, year, exam context) over a results list with a live,aria-livecount. The results list is on-demand (redesign 2026-06-20): it (and the count) stayhiddenuntil the search/any filter is "active"; the inactive default shows a one-line hint and lets the topic grid be the primary browse path — no 68-item wall on load.applyFilters()runs once on load to set that state. Filtering is pure DOM (data-*attributes on each result row); no JS framework, no network.
- a
src/pages/teaching/price-theory/[topic].astro—getStaticPathsover taxonomy topics (one route per non-empty topic); renders each matching problem as a card (verbatim question, provenance line + "source" back-link to Irwin Collier, subtopic chips,<details>solution when present). Adds a visible<h1>, clickable subtopic chips that filter the page (data-chip-value), a source-jump nav, and problems grouped by source/year (groupBySourceYear, anchored<section data-source-group>blocks). Imports the JSON at module scope (fine ingetStaticPaths— imports are allowed there, unlike module consts).- Inline math: inline LaTeX (
$…$) is rendered with KaTeX (added 2026-06-20,f9304fc) viarenderInlineMathinsrc/lib/priceTheory.ts— a shared helper module that also holds the provenance/label/grouping helpers used by both Price Theory pages.renderInlineMathis currency-aware: a$…$pair whose contents start with a digit is treated as a prose dollar amount (e.g.$2.80), not a math delimiter, so ordinary prices don't get mangled. (Was previously a deferred follow-up — rendered raw.) - No publish-gate / no
status:approvedhere — the bank is public by construction (decision 2026-06-18: publish with source attribution). Site-widenoindexstill applies.
The /ai/ "Getting Started with Codex" guide is no longer hand-authored in
this repo. Its source of truth is bryanpcutsinger/Codex-guide (private; local
folder ~/Projects/Codex-guide, a top-level sibling of Website). This repo
holds a generated, committed copy — same source-of-truth model as the micro course,
but for Starlight content. Plan: ~/.Codex/plans/would-it-make-sense-humble-cupcake.md.
Refresh the guide:
npm run import:guide # scripts/import-guide.sh, via gh
It pulls from the guide repo (default branch) over gh — no local cross-folder
dependency — and writes:
posts/**→src/content/docs/ai/**(clear-and-rewrite: this dir is 100% generated, so a renamed/deleted source post can't leave an orphan live page),guide.manifest.json→src/data/guide-sidebar.json(drives the Starlight sidebar via theimportinastro.config.mjs),- the guide's
public/**→ this repo'spublic/**(additive — never deletes site-owned files likefavicon.svgorteaching/**; this is howpublic/templates/Codex-md-economist-template.mdarrives).
No notes-strip / no path-rewrite needed (no instructor notes in the guide). The global
postbuild INSTRUCTOR NOTES gate still runs but is a harmless no-op here.
Rules: never hand-edit src/content/docs/ai/ or src/data/guide-sidebar.json —
edit the source repo + re-import (the next import clobbers local edits). The generated
files must stay committed (CI builds from local files only; it never runs the
import). posts/ in the guide repo is flat (the importer's listing is via the git
trees API but slugs assume a flat layout). Why import-then-commit rather than an Astro 5
remote loader: keeps CI hermetic (no build-time private-repo auth) and every change is
visible in git diff.
The Curriculum vitae download on /research/ and the Research page's
publication data (src/data/publications.json) are imported from a dedicated
source repo, same source-of-truth → import → commit model as the guide/micro/price-theory.
-
src/data/publications.jsonis GENERATED — never hand-edit it (2026-07-15). It is compiled deterministically fromcutsinger_CV.texbyscripts/generate_publications.pyin thecvrepo (a fail-closed LaTeX→JSON parser: any CV entry that doesn't match a known citation grammar fails the run rather than publish a garbled citation; it never fabricates a DOI, venue, or author ordering — early-stage working papers render authors as "With …" because the CV states no ordering). To change the publication list: edit the CV .tex and push (the Publish CV Action regenerates + syncs it here), or runnpm run import:cv(which fetches the .tex + parser and regenerates locally). Sections mapped: Refereed Journal Articles →articles, Books →worksInPress, Book Chapters →bookChapters, Under Review + Working Papers →workingPapers(under-review first); Book Reviews are deliberately CV-only. -
Source of truth =
bryanpcutsinger/cv(private; local~/Documents/CV). A self-contained LaTeX CV:cutsinger_CV.tex(\documentclass[11pt]{article}, no custom.cls/inputs/graphics) + its committed compiledcutsinger_CV.pdf. Editing happens in this repo, not Overleaf (Overleaf was retired for the CV to avoid two diverging sources; the seed was his last Overleaf export, 2026-06-04). -
AUTO-PUBLISH (2026-07-07): the CV repo pushes itself to the website. A Publish CV Action in the
cvrepo (.github/workflows/publish-cv.yml) fires on any push touchingcutsinger_CV.tex: it (1) compiles the PDF (pdflatex/latexmk — CI is the compiler, so no local TeX needed), (2) commits the PDF back to thecvrepo, (3) copies it into this repo'spublic/downloads/cutsinger-cv.pdfand pushes — which triggers this repo's normaldeploy.yml. So Bryan's whole loop is now just: editcutsinger_CV.tex→ push; the live CV updates itself in ~2 min. Needs aWEBSITE_SYNC_TOKENsecret on thecvrepo (fine-grained PAT, Contents:rw on this repo only); if it's missing/expired the Action still compiles but silently skips the sync (no failed runs — only a run warning). Token SET + pipeline verified end-to-end 2026-07-14 (run29369969519: compile →cv-sync[bot]push → Pages deploy → live PDF confirmed).⚠️ The PAT EXPIRES 2026-10-12 (90 days): after that, CV pushes quietly stop reaching the website — regenerate the token (github.com/settings/personal-access-tokens,cv-to-website-sync) and paste it into thecvrepo'sWEBSITE_SYNC_TOKENsecret via the GitHub web UI (NOT! gh secret set— the!prefix can't handle its interactive paste prompt and stores an empty value). The sync commits directly tomainhere — the deploy build itself stays hermetic (it only ever builds committed files; the PAT is used by the CV repo's job, not by this repo's CI). -
Manual fallback:
npm run import:cv(scripts/import-cv.sh, viagh) pulls the compiled PDF intopublic/downloads/cutsinger-cv.pdf(same%PDF-/≥1 KB guard) and regeneratessrc/data/publications.json— it fetchescutsinger_CV.texplus the parser from thecvrepo pinned to ONE commit SHA and runs it locally (one parser, never a drifting copy; aborts before touching the committed JSON if parsing fails). Thennpm run build→ commit + push. -
Sync failures are now LOUD (2026-07-15): the CV repo's Action fails red when
WEBSITE_SYNC_TOKENis missing/expired or the push is rejected (was warning-only) — decided when publications joined the pipeline, so a stale site can't masquerade as a successful publish. When the PAT expires (2026-10-12), CV pushes will turn red until the token is renewed (see the renewal note above). -
Rendering:
research.astro'sDownloadCardusesfileUrl="/downloads/cutsinger-cv.pdf"(real "Download my CV (PDF)" button; the request-fallback path is gone). The generated PDF is never hand-edited — it's owned by the CV repo / import.
The /research/ page (src/pages/research.astro) opens with the PageHead — a headline
plus a 2-sentence lede (the lede prop) that says what Bryan's research does and what
he's currently working on, written from the actual content of the papers, not their
titles. Unlike the citation lists below it (which render from the auto-generated
publications.json), this intro prose is hand-authored inline in research.astro and
refreshed on demand. (Consolidated 2026-07-19 down from a longer two-paragraph "What I work
on." Overview block — which had itself replaced a two-column "Fields" placeholder — because
headline + lede + long overview read as redundant.) The CV DownloadCard sits just beneath
the intro, above the publication lists.
- Grounding layer:
src/data/research-abstracts.json— VERBATIM abstracts of Bryan's own papers, keyed bytitle(matchingpublications.jsonexactly; titles are unique per the CV parser). Hand-maintained, NOT generated, NOT imported by the build — it exists solely to ground the overview so refreshes draft from real content. INTEGRITY: everyabstractis copied verbatim from itssource; a paper with no abstract is omitted, never summarized into that field. Holds 13 entries (11 published articles + the As Good as Gold and Rethinking Deflation working papers). Intentionally absent: the Symposium Introduction (no abstract exists), the book + book chapters, and 5 early working papers awaiting drafts (Captured Gatekeepers; the Fed 2025 framework-review paper; Democracy, Dictatorship, and the Monetary Commons; Free Banking Reform / antebellum; Monetary Rules without Romance) — add each verbatim when Bryan pushes its draft, then refresh the prose (see below). - Refresh ritual (when publications change): the list updates itself from the CV
(
publications.json— see the CV section). To refresh the prose: (1) add/update the paper's verbatim abstract inresearch-abstracts.json; (2) ask Codex to "refresh the research overview" → it re-drafts the 2-sentence lede from the abstracts + currentpublications.json; (3) Bryan reviews; (4)npm run build→ commit. Deliberately NOT auto-generated in CI (keeps the build hermetic and the public-facing prose reviewed — an LLM-in-CI approach was considered and rejected). - Prose is kept thematic (monetary theory/history · seigniorage · public choice · price
theory) so a single paper moving working→published rarely forces a rewrite. The 5 not-yet-
drafted working papers are currently summarized only at the theme level (no paper-specific
claims) until their drafts land. Page section backgrounds alternate surface/raised via a
computed
variantOf()helper (robust to the conditionally-rendered chapters/books sections), not hardcoded variants.
Latest (2026-07-15) — publications now auto-publish from the CV: the Research
page's publications.json is GENERATED from cutsinger_CV.tex by a fail-closed
parser in the cv repo; the Publish CV Action now syncs PDF + JSON to this repo in
ONE commit, and a missing/failed sync fails the run red (was warning-only). First
generated import landed with exactly the expected content diffs (War-on-Prices full
subtitle; AIER spelled out; stale QJPS venue dropped — Bryan confirmed the CV is
right; 3 early-stage working papers added, authors as "With …" since the CV states
no ordering). import:cv fallback regenerates the JSON too. Design went through a
blind two-leg review (Codex Plan agent + Codex gpt-5.6-sol), synthesized. Earlier
same-week: research-page presentation cleanup (26dffb9, f8a0365, 4a7fd5e —
section order, year-grouped hairlines, authors under titles, full-name bold).
Prior (2026-07-14) — CV auto-publish ACTIVATED (config-only, no code change): Bryan
created the fine-grained PAT and set the cv repo's WEBSITE_SYNC_TOKEN secret; a manual
workflow_dispatch test verified the full chain (compile → cv-sync[bot] push to this repo
→ Pages deploy → live PDF serving fresh). The bot's sync commit (6dcd811, PDF 177→226 KB —
CI font embedding differs from the Overleaf seed; expected) was pulled into the local clone.
Latest (2026-07-07) — Research page populated + CV pipeline built: (1) Micro topic
ordering fixed and topics renumbered as sequential "Lecture N" (dropping the repeating
"T#" badge that read as duplicate titles) — commits 412e60a/64478d9. (2) Research page
filled from Bryan's CV (1e18509): 12 refereed articles + 3 book chapters + 1 book in press
- 4 works under review in
data/publications.json, all real (no DOIs — none on the CV, nothing fabricated). (3) CV download is now a live PDF via a newimport:cvpipeline from the newbryanpcutsinger/cvsource repo (see "CV — imported from its own repo" above). Build green throughout (63 pages, INSTRUCTOR NOTES gate passed). Open: confirm the CV seed is current vs. any post-2026-06-04 Overleaf edits; add DOIs/sameAswhen available; Writing page (data/writing.json) still placeholder.
Prior (2026-07-06) — full 21-topic micro course published + pushed + deployed
(b8b0acc, still noindexed): Closes the "micro course publish gap" below. Re-imported
all 21 approved Micro-Economic Principles topics from bryanpcutsinger/micro-principles
(loop over src/content/courses/microeconomics/ → npm run import:topic -- <slug> microeconomics), pulling in Bryan's revised prose across 22 posts (~2,500 insertions /
~700 deletions) and many new interactive HTML figures. Instructor notes stripped at
import; build green (63 pages, postbuild INSTRUCTOR NOTES gate passed); deploy run
28832685598. Pure content re-import — no code changes. The live micro course now renders
all 21 topics (was T1-only). See the updated Publish gate note in the Teaching section.
Prior (2026-07-01) — full front-end REDESIGN committed + pushed + deployed (369cf5f,
still noindexed): The marketing site was rebuilt from scratch as the outward-first
"public economist" system (paper/ink/ledger-green; Fraunces + Newsreader + Inter). See
the rewritten Marketing site and Stack → Theming sections above for the full spec, and
~/.Codex/plans/let-s-try-another-approach-async-knuth.md for the plan (which went through a
Codex review + a 5-adversary red-team; client chose outward-first / design-first / fresh system).
- New/changed:
src/styles/site.css(new token+type system, loaded afterbrand.cssand overriding its shared tokens via aliases); new primitivesDatedList,EmailCapture,PageHead,CloseBand;Buttongainedon-ink; outward Home (index.astro), promoted Speaking, new Writing + Research pages (fed from forgivingdata/{writing,publications}.json, honest labeled placeholders), migrated About + Contact; nav reordered toSpeaking·Writing·Research·Teaching·Guides·About·Contact(header/footer/HeaderLinks); /ai/ Starlight guides retuned (fau-theme.css,SiteTitlefonts); sitewidePersonJSON-LD. Build green (43 pages, postbuild gate passed). - Deliberately DEFERRED (open follow-ups): (1) Teaching pages still use the reused/
claret-era components under aliased tokens — they render fine + build green, but a full
restyle is pending; (2)
brand.css+ claret-era components (ClaretOpener,Colophon,EditorialIndex,PageMasthead) stay until Teaching is migrated, then retire; (3) RSS for Writing not yet added (would be empty until real essays) — add@astrojs/rsswhenwriting.jsonhas real entries; (4) all[PLACEHOLDER]content above (real publications, essay URLs, Recent, CV, forms, reel) still owed by Bryan.
Prior (2026-06-21) — committed + pushed to main (a62547c, deployed, still noindexed):
- Price Theory bank refreshed: 311 → 477 problems across 40 sources. Bryan added new
questions upstream in
bryanpcutsinger/price-theory; published them via the standard loop:npm run import:problems→npm run build(green, 26 pages, postbuildINSTRUCTOR NOTESgate passed) → commit + pushmain(deploy run27904329890went green). Onlysrc/data/price-theory/problems.jsonchanged;taxonomy.jsonwas unchanged, so the 13 topic routes are the same set — and all 13 are now non-empty (exchange-and-traderose from 0 → 14, so it now has a page). Pure content re-import, no code changes.
Prior (2026-06-21) — docs-only (this repo):
- Recorded the single-publisher guardrail in the Deploy section. Noted that this repo
is the sole publisher to the live site and that the
micro-principles(b9d714f) andprice-theory(7cea48d) source repos now carry refusal guardrails in their ownAGENTS.md(both committed + pushed) declining any live-deploy request and redirecting it here. See the new bullet under## Deploy. No code/build change.
Prior (2026-06-20) — committed + pushed to main (594aa0e, deployed, still noindexed):
- Content refresh: revised T1 micro topic + much larger Price Theory bank. Re-imported
the revised
t01-economic-way-of-thinking(npm run import:topic) and refreshed the Price Theory problem bank (npm run import:problems) — the bank grew 68 → 311 problems across 38 sources. Pure content re-import (no code changes):T1 post.md+ its interactive figure, andsrc/data/price-theory/problems.json. Build green (26 pages, postbuild gate passed).- ✅ Micro course publish gap — RESOLVED 2026-07-06 (see the Latest entry): the full 21-topic course is now imported and live. (At this 2026-06-20 point only T1 was imported; Bryan had scoped that update to T1 on purpose.)
Prior (2026-06-20) — committed + pushed to main (eba9b95, deployed, still noindexed):
- Price Theory landing redesigned: search results are on-demand; topic grid leads.
The course home used to dump all 68 problems as one
<ol>on load (search just hid rows) — an overwhelming "wall of every exam." Now the results list + count stayhiddenuntil the search/any filter is "active"; the inactive default shows a one-line hint and theTopicGridis the primary browse path.applyFilters()runs once on load to set the inactive state. Also tightened the About copy (3 → 2 paragraphs; scale still stated in the first sentence). Single file:src/pages/teaching/price-theory.astro(+ a.search-results[hidden]rule sodisplay:griddoesn't defeat thehiddenattr). Build green (25 pages, postbuild gate passed). See the on-demand note in the Price Theory page description above. No follow-ups outstanding.
Prior (2026-06-20) — committed + pushed to main (f9304fc, still noindexed):
- Price Theory: inline math renders via KaTeX + cross-bank search/filtering shipped.
Closes both deferred follow-ups. Added
katexdep + a sharedsrc/lib/priceTheory.ts(provenance/label/grouping helpers + a currency-awarerenderInlineMath), and wired both pages to it. Home page gained a client-side cross-bank search (free-text + topic/source/ instructor/year/exam-context facets, live count); topic pages gained a visible<h1>, filterable subtopic chips, a source-jump nav, and source/year grouping. Also re-importedproblems.json(upstream stripped the[N points]annotations). Build green (25 pages, postbuild gate passed). See "Inline math" + the page descriptions in the Price Theory problem-bank pipeline section. No follow-ups outstanding.
Prior (2026-06-18) — committed to main and deployed (de49b94, still noindexed):
- Price Theory problem bank integrated + LIVE. The placeholder Price Theory course is
now a real, browsable problem bank sourced from the public repo
bryanpcutsinger/price-theory(68 verbatim Chicago/Columbia exam problems across a 13-topic taxonomy). It uses its ownimport:problemspipeline (NOTimport:topic) — see "Price Theory — problem-bank pipeline" in the Teaching section. New/changed:scripts/import-problems.sh, generated+committedsrc/data/price-theory/{problems,taxonomy}.json, rewrittensrc/pages/teaching/price-theory.astro(overview + topic grid), newsrc/pages/teaching/price-theory/[topic].astro(per-topic problem cards w/ provenance + source back-links), realteaching.jsoncard copy. Build green; 12 topic pages live (exchange-and-tradehas 0 problems → no page yet). Refresh loop: edit the source repo →build.pythere →npm run import:problems→npm run build→ commit. Known follow-ups: both resolved 2026-06-20 (f9304fc) — inline LaTeX now renders via KaTeX and cross-bank search/filtering shipped; see the Latest entry above. - Parallel micro work (
b7950ad): between the two Price Theory commits, a separate change landed onmain—import-topic.shnow also copiesfigures/*.htmlinteractive widgets (INSTRUCTOR-NOTES-gated) alongside*.svg, plus the regenerated T1 micro content is now TRACKED (src/content/courses/microeconomics/t01-.../post.md+ a newt01-ppf-interactive.htmlfigure) — superseding the older "held out of git" note below. Heads-up: the AGENTS.md docs commit2eea0bbincidentally swept the T1post.md/htmlin with it (harmless, already pushed; build green).
Prior same day (2026-06-18) — committed to main and deployed (c1cc97b, still noindexed):
- Teaching course cards updated. Renamed the micro course to Micro-Economic
Principles (card + course-page title/headline; URL slug unchanged) with a real
one-line description, and added the Price Theory course card (now backed by the
problem bank above; was a placeholder at
c1cc97b). See the "Courses are scaffold, NOT imported" note in the Teaching section. Committed directly tomainand pushed.
Prior (2026-06-17) — merged to main and deployed (still noindexed):
-
Teaching section + course pipeline shipped.
/teaching/landing +/teaching/microeconomics/course home + the topic-posts pipeline (scripts/import-topic.sh,coursescollection,[topic].astro). Live topic index is empty until a micro topic is flipped tostatus: approvedupstream (none is yet). See "Teaching section + course-content publishing" above. -
AI guide split into its own repo.
/ai/is now imported frombryanpcutsinger/Codex-guide(local~/Projects/Codex-guide); the website holds a generated, committed copy + a manifest-driven sidebar. Output is byte-identical to before the split. See "Codex guide — imported from its own repo" above. -
Held out of git on purpose (untracked, regenerable):
src/content/courses/(the imported T1 micro post) andpublic/teaching/(its figure) — kept out until T1 is re-approved; recreate withnpm run import:topic. -
Branches: today's work landed on
teaching-topics→ai-guide-split, both merged intomainand pushed (2026-06-17). The deploy workflow publishesmainto Pages. -
The history log below predates today and is kept for context; where it says the guide is "mid-rebuild in-repo," that's superseded by the split above.
-
The Cowork/Desktop branch was DELETED (2026-06-15). A standalone "Codex on the Desktop (Cowork & Code)" branch (13 pages under
src/content/docs/ai/desktop/, for a non-technical Windows colleague) was removed entirely — the site's focus is now entirely on Codex. Its sidebar group, thesparkling-strolling-pearl*plan files, and all/ai/desktop/references are gone. The marketing header/footer "Guides" link was repointed/ai/desktop/→/ai/, and the **/ai/Codex guide overviewwhat-is-Codexwere published (draft:false)** so that link lands on real content (see Build status above). The rest of the guide is still being rebuilt.
-
Refocused as a lean "arrive-ready" pre-read (plan:
~/.Codex/plans/crystalline-rolling-jellyfish.md). A read-only multi-agent audit (one agent per post + synthesis) found the guide had become a 17-post standalone curriculum when the goal needs a short pre-read. Revision implemented:- Sidebar collapsed 8 stages → 4 sections; 8 required pages, 9 demoted to a collapsed Reference (for after) group (nothing deleted — only resequenced).
- Overview (
ai/index.mdx) reframed into a required-vs-optional map: "the short path" (2 cards), a literal setup checklist, and a single "Reference, for after" card. Public framing, no in-person-day language. - Path de-numbered — "Step N" prose removed across all posts; intros now open topically and link prerequisites. "Capstone" framing dropped.
your-first-sessiongained a "Success looks like this" setup-verification callout;installing-Codexnow points to it as the end-of-setup check.- Trims:
what-is-Codex"What it's NOT" compressed to one caution;trust-safety-integritywrap-up trimmed and the 4-bullet verification routine folded into its checklist (so the deferredverifying-claudes-workisn't load-bearing). All 9 Reference posts carry a "reference, not required" banner. - DONE + verified in
dev(2026-06-13): all 19 pages return 200, sidebar shows the 4 sections with Reference collapsed, banners/checklist/success-callout render, grep-clean of "Step N"/"capstone". The reframe is complete — not mid-flight. The only remaining work before publish is the screenshots (see Notes/TODO) and the standard pre-publish integrity re-check; do NOT re-run the audit/restructure.
-
Redesigned to Astro+Starlight with FAU theming; runs clean in
dev. The/ai/guide is drafted, restyled to the FAU look, and framed for an academic-economist audience (teaching + research examples, balanced). Landing + overview pages done. -
Phase 1 of the value-add audit is IMPLEMENTED (plan:
~/.Codex/plans/velvet-conjuring-kernighan.md). Grew the guide from 10 → 17 posts and added three sidebar stages. The seven new posts:reading-and-analyzing,errors-and-recovery(Working well);teaching-with-Codex(new Teaching stage);a-real-research-workflow,verifying-claudes-work,reproducibility-and-logs(new Doing research stage);resources-for-economists(new Reference stage). Plus: prompt before/after table +@-ref tip inprompting-habits;/clear/compactcontext-mgmt inyour-first-session; "not enforced" caution + Zotero pointer + template link inCodex-md-and-memory; "backup ≠ version control" callout + recovery cross-link inpointing-Codex; author/credibility line + new stage cards on the overview; thepublic/templates/economist AGENTS.md asset; and the broken/ai/getting-started/link ininstalling-vs-code.mdfixed to/ai/what-is-Codex/. All new pages verified 200 indev. -
External links were verified against live sources (Korinek JEL 2023 via Brookings, Cunningham MixtapeTools/"Referee 2", Zotero MCP, awesome-ai-for-economists, Blattman). The plan's "Sant'Anna econometrics AI agent" lead could not be verified and was dropped — do not reintroduce it without a real source.
-
Phase 2 is deferred (a signposted "Going further" track: Skills/MCP/subagents, model & cost, Git as undo, Codex comparison). See the plan. Not started.
-
PUBLISHED to GitHub Pages (2026-06-13). Live at https://bryanpcutsinger.github.io (public repo
bryanpcutsinger/bryanpcutsinger.github.io; Pages via GitHub Actions). The marketing site is the front end; under/ai/, the Codex guide overview (ai/index.mdx) +what-is-Codexare live (draft:false). Everything staysnoindexed while shared privately. -
Mac/terminal Codex guide — mid-rebuild. The old 17 posts were deleted in the blank-slate rebuild; the overview + posts 1–3 (
what-is-Codex,setting-up-Codex,your-first-session) are published (draft:false, in a minimal live sidebar group) — guide is at 3 of the 6–8 budget. Resume at post 4 (operating modes) perdocs/guide-rebuild-notes.md("RESUME HERE"); as each ships, add its slug to the live sidebar group and link it from the overview. The fuller sidebar structure stays commented inastro.config.mjsuntil the full set is rebuilt.
- Marketing site — open items (see the Marketing site section for the full list).
Highest-value next steps: Web3Forms key + booking email (booking form inert until
then); real talk topics; named testimonials; long bio + exact rank/department; speaker
one-sheet PDF; optional video reel. All are
[PLACEHOLDER]in code. Optional: pre-shrink the 14 MBsrc/assets/on-stage-podium.jpgsource (build already optimizes the output). The TODO bullets below this one are about the older Mac/ai/guide, not the marketing site. - Screenshots — HARD pre-publish blockers on the required path. Several posts have
:::note[Screenshot to add]placeholders for Bryan to fill. On the lean pre-read, these gate solo followability (a beginner with nobody to help hits a wall at a blank placeholder). Priority order: (1)installing-Codex— browser sign-in page (gates auth) + integrated-terminal panel; (2)your-first-session— VS Code with folder + Codex prompt (the "success looks like this" anchor); (3)pointing-Codex-at-your-work— side-by-side diff view; (4)trust-safety-integrity— diff view; (5)installing-vs-code— drag-to-Applications- terminal-open; (6)
terminal-basics,operating-modes— terminal panel; Plan-mode view. Do not flipdraft:falseon the required path until 1–4 are filled (or replaced with text fallbacks). The audit deliberately left these placeholders untouched.
- terminal-open; (6)
- Integrity gate before publish: the new
resources-for-economistsandverifying-claudes-workposts cite external tools/links. They were verified live during the Phase 1 build, but the pages themselves tell readers to re-verify — re-confirm every external link, tool name, and the Korinek citation against a live source at publish time. Nothing ships from memory. - npm advisories: the Starlight install brought build-time deps that report
vulnerabilities (last seen: 3 high, 2 low). Build-time only (not shipped to
visitors).
npm audit fix --forcewas NOT run (breaking). Review before publish. - Astro 6 upgrade — deferred, do after first publish. Unlocks the latest
Starlight line (features, fixes, likely clears the advisories above). Node 24 is
already installed, so the Node 22+ requirement is met; nothing here uses removed
APIs (
Astro.glob,<ViewTransitions/>); main work is Zod 3→4 (mostly absorbed by Starlight). Plan it as one deliberate step:astro@6+ latest@astrojs/starlight. - Custom domain: not set up (on github.io). When added, change
siteinastro.config.mjsand addpublic/CNAME. - Capstone title: the integrity post is titled "Trust, Safety & Integrity" (the academic "Research" qualifier was dropped in the reframe).