Process · The build of this site
The prompts that built this site
Every worker terminal in this build started from one prompt file, written by the orchestrator session. They are published here as written, in the order they ran, with the spec every build lane read first.
Three redactions, shown in [brackets]: a staff member’s first name, a street address and a personal name. Everything else is as written, including the paths on my laptop.
| Lane | Job | Model | Phase | Ran | Words |
|---|---|---|---|---|---|
| lane1 | Epoch AI research | Fable 5.1 | Phase 0 · Research | 21:59:31 → 22:11:35 PT · 12 min | 372 |
| lane2 | Bakery case-study research | Fable 5.1 | Phase 0 · Research | 21:59:32 → 22:14:57 PT · 15 min | 631 |
| lane3 | Design-system research | Fable 5.1 | Phase 0 · Research | 21:59:34 → 22:12:06 PT · 13 min | 305 |
| lane4 | Other projects + profile | Fable 5.1 | Phase 0 · Research | 21:59:35 → 22:07:19 PT · 8 min | 326 |
| SPEC | The contract every build lane follows | Fable 5.1 | Orchestrator | written before Phase A | 3,359 |
| A1 | Design system + shell | Opus 5.5 | Phase A · Build | 22:22:02 → 22:49:44 PT · 28 min | 566 |
| A2 | Chart system (11 renderers) | Opus 5.5 | Phase A · Build | 22:22:03 → 22:58:12 PT · 36 min | 441 |
| A3 | Data files, images, diagrams | Opus 5.5 | Phase A · Build | 22:22:04 → 22:52:34 PT · 30 min | 448 |
| A4 | Epoch explorer study | Opus 5.5 | Phase A · Build | 22:22:05 → 23:03:09 PT · 41 min | 439 |
| A5 | Copy for every page | Opus 5.5 | Phase A · Build | 22:22:06 → 22:43:39 PT · 22 min | 405 |
| B1 | Bakery case-study page | Opus 5.5 | Phase B · Pages | 23:03:35 → 23:24:02 PT · 20 min | 360 |
| B2 | Design-system page | Opus 5.5 | Phase B · Pages | 23:03:36 → 23:20:08 PT · 17 min | 342 |
| B3 | Process page + prompts | Opus 5.5 | Phase B · Pages | 23:03:38 → 23:24:36 PT · 21 min | 387 |
| B4 | Home, About, 404 | Opus 5.5 | Phase B · Pages | 23:03:39 → 23:23:38 PT · 20 min | 362 |
| C1 | QA audit + fixes | Opus 5.5 | Phase C · QA | 23:25:00 → 23:55:41 PT · 31 min | 207 |
| D1 | Figma file (system + screens) | Opus 5.5 | Phase D · Figma | 23:25:08 → 00:05:44 PT · 41 min | 477 |
Phase 0 · Research
Four read-only research terminals, one per source: Epoch AI, the bakery repo, the theme and Figma file, and my other work.
lane1Epoch AI research
You are research lane 1 of a portfolio project. Read "/Users/joseantonioochoa/CC Projects/2027 Portfolio/BRIEF.md" first. Your job: produce a sharp, evidence-based dossier on Epoch AI as a design employer and as a data-product organisation, so a portfolio can be tailored to what they actually ship and need. Use WebFetch/WebSearch heavily. Today is 2026-11-07. Write these files (and only these) into "/Users/joseantonioochoa/CC Projects/2027 Portfolio/research/": 1. epoch-ai.md - The job posting https://jobs.lever.co/epoch-ai/9ad63519-ec2d-4ae0-b838-3d28972cb62a : paraphrase every section faithfully (role, two specializations, responsibilities, must-haves, nice-to-haves, comp, process notes such as "AI tools may assist screening"). - Who Epoch AI is (mission, funding/org type, size, Berkeley office, team page: who is on Product & Design, who is Head of Design if public). - Their product surface, one section each with URL: epoch.ai website, AI Models database, Trends dashboard, Benchmarking Hub / benchmarks, Data on AI hub, GATE model/playground, Frontier Data Centers tracker, AI in the economy / Capabilities work, Gradient Updates newsletter, podcast, social graphics. For each: what it does, how it is laid out, what charts it uses, what feels strong, what feels weak or inconsistent (be candid and specific: density, legibility, mobile, colour, interaction, loading states, IA). - What they shipped or announced in 2026 (news, blog, X/LinkedIn posts, Lever postings) — what direction the org is moving in and what that implies for design needs. - Their visual language: fonts (inspect CSS/computed where possible), colour palette hexes, chart style (library used — look for Plotly/Observable/D3/Vega in page source), logo, spacing, dark/light. - "Portfolio angles that would land": 6–10 concrete ideas, each one paragraph, ranked, each tied to evidence above. 2. epoch-visual-language.md — a compact token-like summary: fonts, hexes, chart conventions, grid, iconography, with sources. 3. epoch-data/ — download 1 to 3 of their public CSV datasets (e.g. the notable AI models dataset from epoch.ai/data, benchmarks data) with curl into this folder, and write epoch-data/README.md naming each file, its URL, licence (they use CC BY), columns, row count, and 3 interesting facts per dataset computable from it (compute them with python3 -I). If a download fails, say so and record the URL. Rules: cite URLs for every claim. Numbers and dates over adjectives. Do not invent. Do not touch any other folder. When done, print DONE.
lane2Bakery case-study research
You are research lane 2 of a portfolio project. Read "/Users/joseantonioochoa/CC Projects/2027 Portfolio/BRIEF.md" first.
You are inside the repo of the CFC Bakery Orders WordPress plugin (José's latest project, live in production since 2026-11-01). This repo is READ-ONLY for you: never git checkout/stash/commit/modify anything here. You may run read-only git commands (log, show, diff --stat, shortlog) and gh read commands (gh issue list/view for joseocfc/cfc-bakery-orders).
Your job: extract everything a case study needs — the story AND the data — so a designer's portfolio can SHOW how José approached, specified and executed this project with AI agents. Write these files into "/Users/joseantonioochoa/CC Projects/2027 Portfolio/research/":
1. bakery-case-study.md — structured as:
a. Context & problem: what the co-op bakery ordering was before (phone/paper?), who the users are (customers, bakery staff like [the deli lead], deli), constraints (WooCommerce, WP Engine, theme separation). Quote the docs.
b. Prep & research: what José did before building — docs/archive/grilling-agenda.md, skeleton-build-plan.md, architecture-plan snapshot, build-roadmap.md, prototype/ folder, docs/figma, docs/menu-import, docs/deli. Summarise each with path. Explain how requirements were established (hard rules, example tables, assumptions register "an undocumented assumption is a bug", token golden rules).
c. Insights: the non-obvious findings that shaped the design (capacity management, cut-off times, holiday bundles, mixed carts, size price push "catalog wins", print tickets, emails inlined, tokens resolution by context). Each with its source path.
d. Execution — backend: architecture of includes/ (list modules with one-line purpose), load order, order statuses, capacity engine, notifications, printing, deli dashboard, importers. Diagram-ready: list components and arrows.
e. Execution — frontend: storefront builder steps, cart, checkout, dashboard screens, the token system (--cfc-bakery-* tokens), responsive rules (782px block etc.), accessibility notes.
f. The AI workflow (this is the headline for the portfolio): orchestrator + lanes in worktrees, session prompts, hand-off logs, reviewer gates (the "9/10 PASS" rule), record-and-ask, the assumptions register (A-numbered rows — what is the latest number?), the CLI check suite (tests/cli — how many checks, how many assertions, what the "Count line" means), browser passes, staging→main rule, José's standing orders. Explain how José, a non-developer, directs this. Quote José's own words captured in commits/docs (e.g. "the allergens should be below ingredients. blank should be None", "all passed. push to main").
g. Outcomes: launch date, what is live, volume if any number exists, what happened in launch week, holiday launch.
h. 10 pull-quotes (short, verbatim, with path) usable as display text.
2. bakery-metrics.json — real numbers for charts. Compute with git/gh/python3 -I. Include:
- commits_by_day: [{date, count}] from first commit to today (all branches: use git log --all).
- commits_by_type: counts of conventional prefixes feat/fix/docs/test/merge/chore/refactor/other.
- commits_by_hour: 24 buckets (local time) — shows when work happens.
- issues: [{number, title, created, closed, state}] via gh issue list --state all --limit 200 --json.
- loc_by_language and file counts (php/js/css/md), docs file count, tests count.
- assertion_count_over_time: parse commit messages / tests/cli/README.md history for "Count" lines like "5904 / 5899" (git log -p on that README or grep commit messages) → [{date, assertions}].
- assumptions_register_rows_over_time if derivable (highest A-number mentioned in commit messages by date).
- milestones: [{date, label}] — first commit, prototype, first storefront, staging, launch 2026-11-01, holiday launch, etc.
- timeline summary: first_commit, launch, days_to_launch, total_commits, contributors.
3. bakery-assets.md — list the best existing images: screenshots from browser passes, Figma exports, photos under docs/ or assets/ or ~/Downloads/bakery-photo-reference, with absolute paths, dimensions (use sips -g pixelWidth -g pixelHeight), and what each shows. Copy the 15 best into "/Users/joseantonioochoa/CC Projects/2027 Portfolio/research/assets/bakery/" with descriptive names (copy only, never move).
4. bakery-architecture.md — nodes and edges for a system diagram (customer → storefront builder → cart/checkout → Woo order → statuses → notifications/print/dashboard; admin → settings/sizes/menu import; token engine). Keep to what the code does.
Rules: path-cite every claim. Prefer numbers. Plain English. Don't modify this repo. When done, print DONE.
lane3Design-system research
You are research lane 3 of a portfolio project. Read "/Users/joseantonioochoa/CC Projects/2027 Portfolio/BRIEF.md" first. You are inside the cfc-theme repo (Community Food Co-op WordPress theme, by José). READ-ONLY: never checkout/stash/commit/modify here; read-only git and gh commands are fine (gh repo joseocfc/cfc-theme). Your job: document the design-system and website work as a second case study, focused on what a design employer (Epoch AI, hiring for product/web design + design systems + data viz) would value. Write into "/Users/joseantonioochoa/CC Projects/2027 Portfolio/research/": 1. design-system-case.md - What the theme is, when it started (first commit), what the live site is (communityfood.coop — fetch it and describe the pages, note what is live). - The token system: guides/design-system (token-system.md, figma-parity.md, theme.json structure, how --wp--preset--* become Figma variables, modes Mobile/Desktop as clamp endpoints, the naming rule). Explain in plain English why this is clever. - figma-parity-check.py (or wherever the parity script lives): what it checks, how it is run, what PASS means. Count the number of tokens mirrored. - The Figma↔code "one system in both directions" rule and the change protocol. - Any design research/decisions docs (guides/, docs/), the bakery architecture-plan.md original, any grilling/spec documents. - The AI workflow evidence here too (CLAUDE.md, agents docs, reviews). - Metrics: commits, dates, number of tokens, components, pages, templates/patterns count, CSS lines. - 6 pull-quotes with paths. 2. design-system-metrics.json — the numbers above as JSON, plus commits_by_day for this repo (git log --all). 3. theme-assets.md — screenshots/images in the repo worth using; copy the best 10 into "/Users/joseantonioochoa/CC Projects/2027 Portfolio/research/assets/theme/" (copy, never move). Also take fresh screenshots of https://www.communityfood.coop/ (home + 2 key pages) at 1440 and 390 widths if a headless Chrome is available (try: "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --headless=new --screenshot=<path> --window-size=1440,2400 <url>); save them in the same assets folder. Rules: cite paths/URLs. Numbers over adjectives. Don't modify the repo. When done, print DONE.
lane4Other projects + profile
You are research lane 4 of a portfolio project. Read "/Users/joseantonioochoa/CC Projects/2027 Portfolio/BRIEF.md" first.
Your job: survey José's other work so the portfolio can pick 2–4 supporting pieces and describe how he works. READ-ONLY everywhere; never modify, commit or checkout in any repo.
Survey each folder in "/Users/joseantonioochoa/CC Projects/" except "2027 Portfolio": [street address], Innovation Agency, Life Budget, Life Habits, [nanny-site folder], Project Net, Side Gig, The Yorker, Tortilleria, Yard Strategy. For each: what it is (read README/CLAUDE.md/docs), its state (prototype/live/abandoned), dates (git log if a repo, else file mtimes), the design/data/AI angle, notable artefacts (Figma links, screenshots, charts, data files, apps), and a 1–5 "portfolio value for a data-viz/product-design role" score with one-line reasoning. Also check the GitHub repos joseocfc/yard-strategy, joseocfc/Project-Net, joseocfc/gf-excel-sync (gh repo view, gh api for tree) for anything not local.
Then read "/Users/joseantonioochoa/ai-playbook/" fully (PLAYBOOK.md, LESSONS.md, LEARNING-PATH.md, SOURCES.md) and summarise José's AI-building method: the ten principles, the kickoff ritual, the gates, what he learned — this is a portfolio piece in itself ("how I work with AI"). Pull 8 verbatim quotes with line refs.
Also read "/Users/joseantonioochoa/CC Projects/2027 Portfolio/research/../" nothing else; and read the LinkedIn text at "/private/tmp/claude-501/-Users-joseantonioochoa-CC-Projects-2027-Portfolio/54ad3109-b727-4ebe-b0ff-0f941533ff50/scratchpad/linkedin.txt" to build a clean profile.
Write into "/Users/joseantonioochoa/CC Projects/2027 Portfolio/research/":
1. other-projects.md — the survey, ranked by portfolio value, with paths.
2. ai-playbook-summary.md — the method, the quotes, and a short "timeline of how his AI practice matured" (dates from the playbook and project folders).
3. jose-profile.md — clean bio facts: roles, dates, employers, education, awards (Shark Tank México winner 2020, HEINEKEN Green Challenge semifinalist 2019, etc.), languages, location (Bellingham, WA — Pacific time, note overlap with Eastern), the skill set actually evidenced (Figma, Webflow, WordPress, design systems, motion/Spline, video, industrial design, AI orchestration). Flag anything in LinkedIn that is stale or weak for this application.
4. other-assets.md — any images worth using; copy the best 10 into "/Users/joseantonioochoa/CC Projects/2027 Portfolio/research/assets/other/" (copy only).
Rules: cite paths. Be concise but complete. When done, print DONE.
The spec
Written by the orchestrator from the research, before any build lane opened. Every build lane reads it first.
SPECSPEC.md — the contract every build lane follows
# SPEC — José Ochoa portfolio site (v1, written 2026-11-07 by the orchestrator)
Read BRIEF.md first. This file is the contract every build lane follows. If the spec and your judgment
disagree on something small, follow the spec; on something big, do the spec's version and leave a note in
`lanes/notes/<your-lane>.md`.
## 0. The thesis (why this site exists)
Epoch AI is forming its first in-house design team (Head of Design posting open since June 2026, two
designers announced, a Website PM posting since September). Their stated pain: "Our researchers and
developers use Claude to change the site directly, and part of this job is keeping that fast without the
site becoming incoherent." Their products: 17+ data explorers built on an in-house D3 chart library, a
claim-first stat-card grammar with confidence intervals, light-only, charts that crop on phones.
José's two strongest pieces answer that pain directly:
1. **CFC Bakery Orders** — a production ordering system he designed and shipped by directing Claude
agents, with reviewer gates, a 6,089-assertion harness and a 2,121-row assumptions register.
One designer, zero developers, live store on 2026-11-01.
2. **The CFC design system** — "one system in both directions": theme.json → CSS variables → Figma
variables, held in parity by a drift checker and an AI hook so nobody (human or agent) can hardcode a value.
So the portfolio's positioning line is: **"I design systems that stay coherent at AI speed."**
Tagline alternatives the copy lane may refine: "Designer. Ships production." / "Design, specified
to the point where agents can build it and reviewers can prove it."
The site must SHOW this. Every number is computed from real data (git logs, GitHub issues, the Figma
file, Epoch's own CSV). Every figure has provenance (source, date, download). The site itself behaves
like a small Epoch-style data product about José's work. AI-in-the-workflow is shown through process
artefacts (prompts, hand-offs, review scores, co-author trailers), never claimed in adjectives.
## 1. Audience and tone
Reader: Epoch's Head of Design (or hiring panel) skimming on a laptop, maybe a phone, 3–6 minutes.
Voice: first person, plain English, specific, calm. Claim-first headlines in sentence case
("142 days from first commit to a live store"). Numbers over adjectives. Never "passionate",
"cutting-edge", "leverage", "seamless". Short paragraphs (≤3 sentences). Honest about trade-offs
(the retro's "change/drop" lists are a feature, not a weakness). Spell "José". Use "the deli lead"
rather than staff names. No customer data, no household finance figures, no partner photo.
## 2. Information architecture (static multi-page site, served from repo root on GitHub Pages)
```
/ Home — hero chart + stat cards + selected work + how I work + contact
/work/bakery-orders/ Case study 1 (flagship) — scrollytelling, 8 charts, screenshots, Figma
/work/design-system/ Case study 2 — one system in both directions (tokens, parity, hook)
/work/epoch-explorer/ Study for Epoch — "Notable AI models, redrawn for a phone" (interactive)
/process/ How I work with AI — the method, evidence, lessons, and this site's own build log
/about/ Bio, timeline, location/overlap, languages, contact
/404.html
```
Each folder has an `index.html` so URLs have no extension. Secondary projects (Project Net, the nanny
funnel) appear as compact cards on Home ("More work") — no dedicated pages in v1.
## 3. Visual system (own identity; compatible with scientific/editorial sites, not a copy of Epoch)
Fonts (Google Fonts, one `<link>`): **Instrument Serif** (display, 400 + italic), **Geist**
(text/UI 400/500/600), **Geist Mono** (numbers, axis labels, eyebrows, code; 400/500).
URL: https://fonts.googleapis.com/css2?family=Geist:wght@400;500;600&family=Geist+Mono:wght@400;500&family=Instrument+Serif:ital@0;1&display=swap
Color tokens (define in `assets/css/tokens.css` on `:root`; dark under BOTH
`@media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) {…} }` AND `:root[data-theme="dark"] {…}`):
| token | light | dark |
|---|---|---|
| --paper | #F6F5F1 | #121412 |
| --paper-2 (cards/alt sections) | #EDEBE4 | #1B1E1B |
| --paper-3 (hover/inset) | #E4E1D8 | #242824 |
| --ink | #121412 | #F1EFE9 |
| --ink-2 | #4A4F4B | #BDBAB1 |
| --ink-3 (muted/meta) | #7A807B | #8A8C86 |
| --line | #DAD6CC | #2C302C |
| --accent | #2A78D6 | #3987E5 |
| --accent-ink (text on paper) | #1C5CAB | #6DA7EC |
| --accent-soft | #DCE9F8 | #17304F |
| --series-1..8 | #2a78d6 #eb6834 #1baf7a #eda100 #e87ba4 #008300 #6250d6 #e34948 | #3987e5 #d95926 #199e70 #c98500 #d55181 #008300 #9085e9 #e66767 |
| --seq-100..700 (blue ramp) | #cde2fb #b7d3f6 #9ec5f4 #86b6ef #6da7ec #5598e7 #3987e5 #2a78d6 #256abf #1c5cab #184f95 #104281 #0d366b | same steps; pick the lighter end for dark |
| --good / --warn / --bad | #1a7f37 / #b7791f / #c62828 | #3fb950 / #d4a72c / #ff6b6b |
These series colors come from the validated dataviz palette (`/private/tmp/claude-501/bundled-skills/2.1.319/039104e58e73864ab5cfa2728a71e274/dataviz/references/palette.md`). Charts use series slots in fixed order; a single-series chart uses --accent.
Type scale (fluid): `--fs-display: clamp(2.75rem, 1.5rem + 5.5vw, 6rem)` (Instrument Serif, line-height .98, letter-spacing -.015em) · `--fs-h1: clamp(2.25rem, 1.4rem + 3vw, 3.75rem)` · `--fs-h2: clamp(1.625rem, 1.2rem + 1.6vw, 2.375rem)` · `--fs-h3: 1.25rem` · `--fs-body: 1.0625rem` line-height 1.6 · `--fs-small: .9rem` · `--fs-meta: .78rem` (mono, uppercase, letter-spacing .08em). Headings h1/h2 in Instrument Serif, h3+ in Geist 600. Numbers in stat cards: Instrument Serif at 3–4.5rem with tabular figures via Geist Mono for units.
Spacing: 4px base; `--space-1..10` = 4 8 12 16 24 32 48 64 96 128. Section padding `clamp(4rem, 8vw, 8rem)`.
Layout: `--w-content: 1120px`, `--w-prose: 680px`, side gutter `clamp(16px, 4vw, 40px)`. Charts may bleed to content width inside prose sections (`.bleed`).
Radius: 6px controls, 12px cards, 999px pills. Borders 1px `--line`; no drop shadows except tooltips.
Motion: reveal-on-scroll (opacity+8px translate, 500ms ease-out, stagger 60ms), chart draw-in on first intersection, count-up on stat numbers (900ms), View Transitions API for same-origin navigation (`@view-transition { navigation: auto; }`), all disabled under `prefers-reduced-motion`.
Theme toggle in the header (sun/moon icon button), persisted to localStorage, applied before first paint (inline script in `<head>`), dispatches `document.dispatchEvent(new CustomEvent('themechange'))` so charts re-render.
Dark mode is a first-class, selected design, not a filter.
## 4. Page skeleton (canonical; every page copies it)
```html
<!doctype html><html lang="en"><head>
<meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>… — José Ochoa</title><meta name="description" content="…">
<meta property="og:title" …><meta property="og:description" …><meta property="og:image" content="/assets/img/og.png">
<link rel="icon" href="/assets/img/favicon.svg" type="image/svg+xml">
<script>/* theme boot: read localStorage 'theme', set data-theme on <html> */</script>
<link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?…" rel="stylesheet">
<link rel="stylesheet" href="/assets/css/tokens.css"><link rel="stylesheet" href="/assets/css/base.css"><link rel="stylesheet" href="/assets/css/components.css"><link rel="stylesheet" href="/assets/css/charts.css">
</head><body>
<a class="skip" href="#main">Skip to content</a>
<header class="site-header">…wordmark "José Ochoa" (link /), nav: Work ▾(3 items) · Process · About · theme toggle…</header>
<main id="main">…</main>
<footer class="site-footer">…email, LinkedIn, GitHub, "Built 2026-11 with Claude Code; every chart's data is downloadable" , theme toggle…</footer>
<script type="module" src="/assets/js/site.js"></script>
</body></html>
```
Absolute paths starting with `/` (the site is served from the domain root `https://joseocfc.github.io/`).
Header collapses to a hamburger under 768px. Skip link, focus-visible rings (2px --accent), landmarks, alt text on all images, `aria-label` on icon buttons. Lighthouse a11y target ≥ 95.
## 5. Components (CSS classes in `assets/css/components.css`; markup conventions)
- `.eyebrow` — mono meta line above headings ("Case study · 2026").
- `.hero` — display headline + 1-paragraph dek + hero figure.
- `.stat-card` — `<article class="stat-card"><p class="stat-label">…</p><p class="stat-value" data-count="1503">1,503</p><p class="stat-claim">…</p><footer class="stat-meta">source · date</footer></article>`; grid `.stat-grid` (auto-fit minmax 220px).
- `.figure` — the chart frame (see §6).
- `.toc` — sticky in-page table of contents on ≥1024px (left rail), horizontal scroll chips on mobile; highlights current section via IntersectionObserver.
- `.media` — screenshot frame: `<figure class="media"><img …><figcaption>…</figcaption></figure>`; `.media--phone` (max 390px wide centered), `.media--browser` (thin top bar with three dots), `.media-row` (2–3 across, wraps).
- `.quote` — pull quote with `<cite>` showing the path/source in mono.
- `.callout` — bordered note (`--callout-good/--warn`).
- `.timeline` — vertical list of dated events.
- `.steps` — numbered process ladder.
- `.tag` — pill.
- `.card` / `.work-card` — image + eyebrow + title + one-line + tags; whole card is a link.
- `.diagram` — inline SVG system diagrams (use currentColor and the tokens; no raster).
- `.case-nav` — prev/next at case-study end.
- Buttons: `.btn`, `.btn--primary` (accent fill, ink-on-accent white), `.btn--ghost`.
## 6. Figure anatomy and chart API (lane "charts" owns `assets/js/charts/`, `assets/css/charts.css`)
Markup every page uses:
```html
<figure class="figure" data-chart="timeline" data-src="/data/bakery-metrics.json" id="fig-timeline">
<header><p class="eyebrow">Figure 1 · Commits per day</p>
<h3 class="figure-title">142 days from first commit to a live store</h3>
<p class="figure-sub">Daily commits across all branches, with milestones. October alone holds 1,174 of 1,503.</p></header>
<div class="chart" role="img" aria-label="…one-sentence description…"></div>
<figcaption>…one-sentence takeaway…</figcaption>
<footer class="figure-foot"><span>Source: git log --all, computed 2026-11-07</span>
<span class="figure-actions"><button data-action="table">Table</button><a data-action="download" download>Data</a></span></footer>
</figure>
```
`assets/js/charts/index.js` finds every `[data-chart]`, fetches `data-src` (cached per URL), and calls the registered renderer `render(chartEl, data, ctx)` where `ctx = { theme, reduced, width, tooltip, fmt, colors }`. Core responsibilities: ResizeObserver re-render (debounced), re-render on `themechange`, draw-in only on first intersection, a shared HTML tooltip (`.chart-tip`), the Table toggle (renders an accessible `<table>` from the renderer's `table()` output below the chart), and Data download (Blob of the JSON slice the renderer used). All colors read from CSS variables via `getComputedStyle` at render time, never hardcoded. Thin marks, 2px lines, 4px bar radius at data end, 2px gap between stacked segments, recessive grid, direct labels where ≤4 series, legend always for ≥2 series, one axis (never dual-axis), log scale labelled in powers where used. Numbers formatted with thin thousands separators. Axis/legend text in `--ink-3` mono `.72rem`. Follow the dataviz skill references at `/private/tmp/claude-501/bundled-skills/2.1.319/039104e58e73864ab5cfa2728a71e274/dataviz/references/` (marks-and-anatomy.md, interaction.md, anti-patterns.md).
Renderers (name → data → form):
1. `timeline` — bakery `commits_by_day` + `milestones` → daily bars (accent), milestone markers with labels (top 6 at desktop, 3 at mobile, rest in tooltip), brush-free, x = date, y = commits (linear; note the 307 spike with a broken-axis label is NOT allowed — instead let the spike stand and annotate it).
2. `growth` — `assertion_count_over_time` and `assumptions_register_rows_over_time` → two small multiples (not dual axis), step/area lines, end labels "6,089 assertions" / "A2121".
3. `issues` — `issues[]` → cumulative opened vs closed lines (series-1 opened, series-2 closed), with the gap shaded, plus median-days-to-close as a note.
4. `heat` — `commits_by_hour` × weekday matrix derived from... (the JSON has by_hour and by_weekday separately; render two small bar charts side by side: by hour (24 bars) and by weekday (7 bars), sequential accent; caption "nights and Mondays").
5. `rounds` — `review_gate.mentions_in_records` → horizontal bars: 1 round 90 · 2 rounds 69 · 3 rounds 18 · 4 rounds 2 · 5 rounds 9 · 10/10 4.
6. `types` — `commits_by_type` → single stacked horizontal bar (100%) with direct labels; docs 734 called out honestly.
7. `models` — `ai_coauthorship.by_model` → horizontal bars sorted desc, note "1,482 of 1,503 commits carry a Claude co-author trailer".
8. `loc` — `loc_by_area` → horizontal bars: tests 62,396 vs includes 50,116 vs docs 51,114 …
9. `ds-commits` — design-system-metrics.json commits_by_day with a vertical marker at 2026-07-17 "v1.0 frozen" and the DS window shaded (2026-06-25 → 2026-08-21).
10. `tokens` — design-system token families → horizontal bars (counts by family) or a dot matrix.
11. `build-log` — this site's own build: lanes as a Gantt (start/end per lane from `data/build-log.json`).
The Epoch explorer is a separate module (`assets/js/epoch-explorer.js`) with its own spec in §8.
## 7. Content plan per page (the copy lane writes `content/<page>.md`; page lanes assemble)
### Home
1. Hero: eyebrow "José Ochoa · Product & web design · Data visualization"; display headline (copy lane proposes 3, picks 1; direction: "I design systems that stay coherent at AI speed."); dek: 2 sentences naming the bakery launch and the design system; CTA "Read the bakery case study" + "How I work".
Hero figure = Figure `timeline` (full content width) under the dek.
2. Stat grid (4): "1 designer · 0 developers → 1 live store (2026-11-01)"; "6,089 automated assertions, 1 known red"; "2,121 numbered assumptions, each with a status"; "200 tokens, 1 source of truth, 0 hand-authored hexes".
3. Selected work (3 large cards): Bakery Orders, Design system, Epoch explorer study. Then "More work" (2 small): Project Net, nanny funnel (image + 1 line + link to live site).
4. How I work (3 steps, each 2 lines, linking /process/): Specify → Direct → Prove.
5. About teaser + contact (email, LinkedIn, GitHub, location "Bellingham, WA · Pacific · 9–2 PT overlaps 12–5 ET").
### /work/bakery-orders/ (TOC sections)
0. Hero: eyebrow "Case study · Community Food Co-op · Jun–Nov 2026"; title claim ("A bakery ordering system, designed and shipped by one designer directing AI agents"); dek; 4 inline stats; hero media = storefront-landing-1440 (browser frame) + storefront-landing-375 (phone) side by side.
1. **The problem** — phone/paper orders, the deli's 25-sheet workbook ("Every sheet is an island"), who the users are. 1 quote.
2. **Research and requirements** — the grilling habit, the 12 locked decisions, hard rules, example tables, the assumptions register rule ("An undocumented assumption is a bug"). Show an excerpt of a real example table and the register (as styled HTML tables, 4–6 rows). Figure `growth` here (register grew with the harness).
3. **Insights that shaped the design** — 5 of the 17 (capacity counter not cap; cut-off is a minute not a day; pickup-first flow; print click not auto-print; one breakpoint at 782px). Each: 2 sentences + source path in mono.
4. **Design** — Figma journey (13 screens at 375), components, the 30 logged deviations, 91 copy edits over 691 text layers; media row from `research/assets/figma/20-…`, `22-…`, `21-…`; token rule.
5. **Build: backend and frontend** — system diagram (inline SVG from `bakery-architecture.md`), the 64 modules in 10 groups (compact list), the three token resolution contexts (LIVE/SNAPSHOT/INLINE) as a small diagram, Figure `loc`.
6. **The AI workflow** — orchestrator + lanes diagram (animated: orchestrator node, N lane nodes in worktrees, reviewer node, José gate, staging → main); ticket prompt anatomy (real headings); hand-off anatomy; the review gate (Figure `rounds`); record-and-ask; the harness (Figure `issues`, Figure `heat`); co-authorship (Figure `models`); commit mix (Figure `types`). Quotes: "all passed. push to main", "It does not trust the builder's word.", "you are the orchestrator … I will leave this plugged in until you are done".
7. **Outcome** — live 2026-11-01, holiday opened 11-04, launch-week table, screenshots (dashboard, deli screen, print ticket, email).
8. **What I'd change** — from LESSONS.md: 3 keep, 3 change, 2 drop. Honest.
9. Case nav → design system.
### /work/design-system/
Hero claim ("One system in both directions"); the problem ("a decade of drifted, hardcoded, duplicated CSS"); the decision (no parallel layer; WordPress's own emitted names are the contract); the naming rule diagram (theme.json → `--wp--preset--color--primary` → Figma `color/primary` with WEB code syntax); the six token families (Figure `tokens`); modes = clamp endpoints (small diagram of Mobile/Desktop); the parity checker (what it checks, PASS, NOT_MIRRORED allowlist) and the PostToolUse hook (an agent cannot hardcode a value without it surfacing); the change protocol; the freeze timeline (Figure `ds-commits`, 94 commits on 2026-07-17); Figma evidence media (cover, colors, typography, buttons 105 variants, token board, changelog); live-site screenshots (home 1440/390); what's weak (cover still says provisional; changelog stops in August) — honesty; case nav → Epoch explorer.
### /work/epoch-explorer/ (see §8)
### /process/
Hero claim ("I own the what and the done. Agents own the how, and show proof."); the ten principles (compact numbered list); the loop diagram (brief → plan → build in lane → fresh review 9/10 ≤3 rounds → staging → phone check → "passed" → production); evidence panel: a real ticket-prompt excerpt, a hand-off excerpt, a register excerpt, Figure `rounds`, Figure `models`; "What changed after the retro" (keep/change/drop); **This site** — "Built in one night by one orchestrator and N worker terminals" with Figure `build-log` and links to the lane prompts (copied into `/process/prompts/*.md` rendered as `<pre>` or as text pages); note which models did what (orchestrator Fable 5.1; workers Opus 5.5 from Phase A).
### /about/
Short bio (4 sentences), timeline (2014 Tec de Monterrey industrial design → 2019 Ecomush, Shark Tank México winner 2020 → 2020 GoHomes brand lead → 2022 Omneky visual → 2023 lead web design (Webflow, Figma systems, Localization) → 2025 Community Food Co-op web designer → 2026 shipped plugins + design system), what I bring to Epoch (3 bullets, concrete), practicalities (Bellingham WA, Pacific, ET overlap, Spanish/English, remote-ready), contact. No photo.
## 8. The Epoch explorer study (lane "epoch")
Page `/work/epoch-explorer/`. Title claim: "Notable AI models, redrawn for a phone." Dek: "Epoch's AI Models explorer is excellent on a laptop and crops on a phone. I rebuilt the core chart from their CC-BY dataset to show how I'd approach it." Sections:
1. What I looked at (facts observed 2026-11-07, neutral tone, no snark): at 390px the chart crops at ~2010; label collisions at the frontier; settings become a 'Customize graph' button but the plot does not reflow; copy says 3,200+ in one place and 3,700+ in another; Trends header date vs card data dates.
2. The rebuilt chart (interactive, D3): scatter of training compute (log y, FLOP) vs publication date from `data/epoch/notable_models.json` (trimmed from `research/epoch-data/notable_ai_models.csv` — keep: name, date, domain, organization, country, compute, parameters, dataset size, notability, confidence; drop rows without compute+date). Controls (one row above, wrap on mobile → bottom sheet under 768px): colour by (Domain / Organization top-8+Other / Country top-8+Other), range chips (All time / Deep learning era 2010+ / 2020+), label density (Top 12 / Top 30 / Frontier only), regression toggle (OLS on log10 compute vs year for 2010+, with the rate stated in words "×/year" and a 90% CI from the fit). Mobile: the chart reflows (height adapts, x ticks thin, labels drop to Top 6, tap = tooltip), never crops.
Label rule: candidates ranked by compute within rolling 6-month windows; place with simple collision avoidance (greedy, skip if overlaps); leader lines only when displaced > 8px.
3. The stat-card grammar: three cards computed live from the data in Epoch's "one dataset, three framings" style — a unit switch (Increase/year | Doubling time | OOM/year) rewrites number AND sentence. Document the copy template.
4. Same data, in Python: `tools/epoch_chart.py` (matplotlib; set up a venv in the scratchpad: `python3 -m venv <scratchpad>/venv && <venv>/bin/pip install matplotlib pandas`) renders `assets/img/epoch/notable-models-mpl.png` at 2x with the same encoding; show the PNG and a collapsible code block (`<details>`). This covers Epoch's Python nice-to-have.
5. What I would do next (IA for the Data hub: 17 datasets, three repeats; a leader-line rule as a design-system token; a 390px chart contract). 5 bullets.
Attribution block: "Data: Epoch AI, 'Notable AI Models' (CC BY 4.0), downloaded 2026-11-07 from epoch.ai/data/notable-ai-models. Redrawn by José Ochoa; not affiliated with Epoch AI."
Palette: Domain categories use series slots in fixed order (Language 1, Vision 2, Multimodal 3, Games 4, Speech 5, Biology 6, Robotics 7, Other 8); never Epoch's own palette (we are not imitating their brand).
## 9. Files and ownership (lanes write ONLY inside their paths)
```
site/
index.html lane: home (Phase B) — Phase A shell lane makes a working draft
work/bakery-orders/index.html lane: bakery (B)
work/design-system/index.html lane: design-system (B)
work/epoch-explorer/index.html lane: epoch (A4 builds module + page)
process/index.html, process/prompts/*.html lane: process (B)
about/index.html, 404.html lane: about (B)
templates/page.html lane: shell (A1) — canonical skeleton all pages copy
assets/css/{tokens,base,components}.css lane: shell (A1)
assets/css/charts.css, assets/js/charts/* lane: charts (A2)
assets/js/site.js (theme, nav, reveal, toc, count-up, view transitions) lane: shell (A1)
assets/js/epoch-explorer.js, tools/epoch_chart.py, assets/img/epoch/* lane: epoch (A4)
assets/img/{og.png,favicon.svg} lane: shell (A1)
assets/img/bakery/*, figma/*, theme/*, other/* lane: data (A3) — optimized copies (max 1800px wide, <400KB each; use sips)
data/*.json lane: data (A3) · data/epoch/* lane: epoch (A4)
charts-demo.html lane: charts (A2) — renders every renderer with real data
content/*.md lane: copy (A5)
lanes/notes/<lane>.md each lane: decisions, open questions, what it could not do
```
Serve locally for checks with `python3 -m http.server 8787 --directory "<site>"` (pick a free port per lane: shell 8787, charts 8788, epoch 8789, bakery 8790, design 8791, process 8792, about 8793, qa 8794). Screenshot with headless Chrome: `"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --headless=new --disable-gpu --hide-scrollbars --screenshot=<out.png> --window-size=390,2200 http://localhost:PORT/...` and at 1440. Look at your screenshots (Read the PNG) before declaring done.
## 10. Definition of done (every lane)
- Your files exist at the paths above, nothing written elsewhere, no edits to research/ or other lanes' files.
- Pages validate: no console errors (check with `--enable-logging=stderr --v=0` or by eye), no horizontal scroll at 390px, all links resolve locally, images have alt text.
- Light AND dark screenshots taken at 390 and 1440 and saved under `lanes/shots/<lane>/`.
- `lanes/notes/<lane>.md` written: what you built, deviations from the spec, anything the orchestrator must decide.
- Print DONE as the last line.
Phase A · Build
Five terminals in parallel, each owning its own files: the design system and shell, the chart system, data and images, the Epoch study, and the copy.
A1Design system + shell
You are build lane A1 "shell" (model: Opus 5.5). Read "/Users/joseantonioochoa/CC Projects/2027 Portfolio/BRIEF.md" and then "/Users/joseantonioochoa/CC Projects/2027 Portfolio/SPEC.md" in full before doing anything. The spec is the contract: file ownership, tokens, markup, chart API, definition of done. Research material lives in "/Users/joseantonioochoa/CC Projects/2027 Portfolio/research/" (read what you need; never modify it). Write only inside the paths the spec assigns to your lane plus lanes/notes/<lane>.md and lanes/shots/<lane>/. Work autonomously; do not ask questions — decide, note the decision, continue. Quality bar: this portfolio must impress the Head of Design at Epoch AI; typography, spacing, and chart craft matter more than feature count. Finish by printing DONE.
Build the site's design system and shell in "/Users/joseantonioochoa/CC Projects/2027 Portfolio/site/":
1. assets/css/tokens.css — every token in SPEC §3 (light + dark under both scopes), type scale, spacing, widths, radii, motion durations, and `color-scheme`.
2. assets/css/base.css — reset, body background (--paper) and ink, typography (Instrument Serif display/h1/h2, Geist text, Geist Mono meta), links, focus-visible, prose measure, `.container`, `.prose`, `.bleed`, section spacing, `@view-transition { navigation: auto; }`, reduced-motion.
3. assets/css/components.css — every component in SPEC §5 with real, polished styling: site header (wordmark, nav with a "Work" dropdown of three items, Process, About, theme toggle; collapses to a hamburger under 768px with an accessible disclosure), footer, eyebrow, hero, stat-card + stat-grid, media frames (phone/browser/row), quote with cite, callout, timeline, steps, tag, work-card/card, diagram, case-nav, buttons, toc (sticky left rail ≥1024px, horizontal chips below), table styling for data tables, skip link, `.reveal` states.
4. assets/js/site.js (ES module) — theme boot helper + toggle (persist, dispatch 'themechange'), mobile nav, reveal-on-scroll (IntersectionObserver, stagger), count-up for [data-count] (respect reduced motion; format with thousands separators), TOC current-section highlighting, external links get rel=noopener. Keep it under ~300 lines, no dependencies.
5. templates/page.html — the canonical skeleton from SPEC §4 with the exact inline theme-boot script, head tags, header and footer markup, and comment markers <!-- PAGE CONTENT --> where page lanes insert content. Other lanes will copy this verbatim, so make it complete and correct (absolute paths from /).
6. assets/img/favicon.svg (a simple monogram "JO" or a mark made of two strokes in --accent; must work on light and dark) and assets/img/og.png (1200×630: paper background, the headline "I design systems that stay coherent at AI speed." in Instrument Serif, name below in Geist; render it with headless Chrome from a temporary HTML file).
7. index.html — a WORKING DRAFT of the home page using the template and SPEC §7 Home structure with placeholder copy where content/home.md does not exist yet (the copy lane is writing it in parallel; if "/Users/joseantonioochoa/CC Projects/2027 Portfolio/content/home.md" exists when you get to this step, use it). Include the hero figure markup for data-chart="timeline" (the charts lane provides the renderer; if /assets/js/charts/index.js does not exist yet, include the <script type="module" src="/assets/js/charts/index.js"> tag anyway) and the stat grid with the four real numbers from SPEC. Work cards use images from research/assets (copy the 5 you need into assets/img/home/ optimized with sips to ≤1600px wide).
8. A components showcase page at /styleguide/index.html rendering every component in both themes (used by the QA lane and by the Figma lane later).
Serve on port 8787, screenshot /, /styleguide/ at 390 and 1440 in light and dark into lanes/shots/A1/, Read the PNGs and fix what looks off (overflow, spacing rhythm, contrast). Typography and whitespace are the product here; make it feel like a serious editorial/scientific site, warm paper, precise.
A2Chart system (11 renderers)
You are build lane A2 "charts" (model: Opus 5.5). Read "/Users/joseantonioochoa/CC Projects/2027 Portfolio/BRIEF.md" and then "/Users/joseantonioochoa/CC Projects/2027 Portfolio/SPEC.md" in full before doing anything. The spec is the contract: file ownership, tokens, markup, chart API, definition of done. Research material lives in "/Users/joseantonioochoa/CC Projects/2027 Portfolio/research/" (read what you need; never modify it). Write only inside the paths the spec assigns to your lane plus lanes/notes/<lane>.md and lanes/shots/<lane>/. Work autonomously; do not ask questions — decide, note the decision, continue. Quality bar: this portfolio must impress the Head of Design at Epoch AI; typography, spacing, and chart craft matter more than feature count. Finish by printing DONE.
Build the chart system in "/Users/joseantonioochoa/CC Projects/2027 Portfolio/site/": assets/js/charts/index.js (core: discovery of [data-chart], fetch+cache of data-src, ResizeObserver, themechange re-render, first-intersection draw-in, shared tooltip, Table toggle, Data download, number/date formatters, color reading from CSS variables), one module per renderer listed in SPEC §6 (timeline, growth, issues, heat, rounds, types, models, loc, ds-commits, tokens, build-log), and assets/css/charts.css (figure anatomy, axes/grid/legend styles, tooltip, table view, responsive heights). Use D3 v7 from cdnjs: https://cdnjs.cloudflare.com/ajax/libs/d3/7.9.0/d3.min.js (import via a <script> tag in pages; in modules reference the global `d3`, and in index.js, if window.d3 is missing, inject that script tag and await it).
Data: /data/bakery-metrics.json and /data/design-system-metrics.json already exist in site/data (copied from research). For build-log, create a placeholder /data/build-log.json with the schema {"generated":"…","lanes":[{"id":"lane1","label":"Epoch research","model":"Fable 5.1","start":"2026-11-07T21:59:31-08:00","end":"2026-11-07T22:11:35-08:00","phase":"research"}]} using the real lane times from "/Users/joseantonioochoa/CC Projects/2027 Portfolio/lanes/logs/*.log" (first and last lines) — the orchestrator will extend it later.
Before coding, read the dataviz skill references: /private/tmp/claude-501/bundled-skills/2.1.319/039104e58e73864ab5cfa2728a71e274/dataviz/references/{marks-and-anatomy,interaction,anti-patterns,choosing-a-form}.md. Run the palette validator on the SPEC series colors for both modes: node /private/tmp/claude-501/bundled-skills/2.1.319/039104e58e73864ab5cfa2728a71e274/dataviz/scripts/validate_palette.js "<hexes>" --mode light (and dark) and record the result in your notes.
Build charts-demo.html (copy the skeleton from site/templates/page.html if it exists by then; otherwise a minimal page linking the four CSS files) that renders every renderer with the real data, each in the full figure anatomy from SPEC §6 with real titles/captions/sources. Each renderer must: look excellent at 390px and 1440px, re-render on theme change, expose table() for the Table toggle, label directly where ≤4 series, use a legend for ≥2 series, show a tooltip on hover/tap, animate in once (bars grow, lines draw) unless reduced motion. Milestone labels on the timeline must not collide (greedy placement, drop to tooltip when crowded). No dual axes. No hardcoded hex.
Serve on port 8788, screenshot charts-demo.html at 390 and 1440 in light and dark into lanes/shots/A2/, Read the PNGs, fix collisions/overflow, iterate until it is genuinely good. Document the API for page lanes at the top of index.js and in lanes/notes/A2.md (how to add a figure, which data-src each renderer expects, options via data-* attributes).
A3Data files, images, diagrams
You are build lane A3 "data + images" (model: Opus 5.5). Read "/Users/joseantonioochoa/CC Projects/2027 Portfolio/BRIEF.md" and then "/Users/joseantonioochoa/CC Projects/2027 Portfolio/SPEC.md" in full before doing anything. The spec is the contract: file ownership, tokens, markup, chart API, definition of done. Research material lives in "/Users/joseantonioochoa/CC Projects/2027 Portfolio/research/" (read what you need; never modify it). Write only inside the paths the spec assigns to your lane plus lanes/notes/<lane>.md and lanes/shots/<lane>/. Work autonomously; do not ask questions — decide, note the decision, continue. Quality bar: this portfolio must impress the Head of Design at Epoch AI; typography, spacing, and chart craft matter more than feature count. Finish by printing DONE.
Tasks, in "/Users/joseantonioochoa/CC Projects/2027 Portfolio/site/":
1. data/: keep bakery-metrics.json and design-system-metrics.json (already copied). Add data/figma-cfc-system.json (from research/figma-cfc-system.md: pages, variable collections with counts and modes, components counts incl. the 105-variant button set, changelog entries with dates, instance/frame counts), data/profile.json (from research/jose-profile.md: roles with dates, education, awards, languages, location, overlap window), data/projects.json (the supporting projects from research/other-projects.md: Project Net, nanny funnel, Family Finances (anonymised, no numbers), [street address] — title, one-liner, dates, stack, live URL if any, image file), data/bakery-insights.json (the 17 insights from research/bakery-case-study.md §c as {title, two-sentence summary, source_path}), data/bakery-quotes.json (the ten pull quotes + runners-up, verbatim, with path), data/bakery-launch-week.json (the launch-week table), data/lessons.json (keep/change/drop + incidents→rules from research/ai-playbook-summary.md and bakery-case-study.md Part 4 §10 / Part 5), data/architecture.json (nodes/edges from research/bakery-architecture.md, grouped). Validate every JSON with python3 -I -m json.tool.
2. assets/img/: copy and optimize images from research/assets/{bakery,figma,theme,other}/ into assets/img/{bakery,figma,theme,other}/ keeping descriptive names; max 1800px wide, JPEG quality ~82 for photos/screens with many colors (sips -s format jpeg -s formatOptions 82), PNG for UI with flat colors if smaller; target <400KB each, never upscale. Skip anything containing a real person's face or real customer/household data. Write assets/img/MANIFEST.md listing each file, dimensions, bytes, what it shows, and which page should use it (per SPEC §7).
3. Produce two inline-SVG diagrams as standalone files the page lanes will paste: assets/svg/bakery-architecture.svg (customer → storefront builder → cart/checkout → Woo order → statuses → notifications / print / dashboards; admin → settings / sizes / imports; token engine feeding storefront/admin/print/email) and assets/svg/orchestration.svg (José → orchestrator → lanes in worktrees → fresh reviewer (9/10) → staging → José's phone check → main). Use currentColor strokes, the CSS variables for fills (var(--paper-2), var(--accent), var(--line)), Geist/Geist Mono via CSS font-family with fallbacks, viewBox-based so they scale, readable at 390px (stack vertically under 600px using a second <svg> variant if needed: name them *-wide.svg and *-narrow.svg). Keep text short. Check them in a browser at both widths (serve on port 8790, screenshot into lanes/shots/A3/, Read the PNGs).
Write lanes/notes/A3.md with the manifest summary and anything you excluded and why.
A4Epoch explorer study
You are build lane A4 "epoch explorer" (model: Opus 5.5). Read "/Users/joseantonioochoa/CC Projects/2027 Portfolio/BRIEF.md" and then "/Users/joseantonioochoa/CC Projects/2027 Portfolio/SPEC.md" in full before doing anything. The spec is the contract: file ownership, tokens, markup, chart API, definition of done. Research material lives in "/Users/joseantonioochoa/CC Projects/2027 Portfolio/research/" (read what you need; never modify it). Write only inside the paths the spec assigns to your lane plus lanes/notes/<lane>.md and lanes/shots/<lane>/. Work autonomously; do not ask questions — decide, note the decision, continue. Quality bar: this portfolio must impress the Head of Design at Epoch AI; typography, spacing, and chart craft matter more than feature count. Finish by printing DONE.
Build the Epoch study page and module per SPEC §8 in "/Users/joseantonioochoa/CC Projects/2027 Portfolio/site/": data/epoch/notable_models.json (trim research/epoch-data/notable_ai_models.csv with python3 -I — inspect the header first, keep the columns SPEC names, drop rows without both a date and training compute, keep the file under ~600KB; also write data/epoch/README.md with the row counts before/after and the licence line), assets/js/epoch-explorer.js (self-contained ES module using global d3 v7 from https://cdnjs.cloudflare.com/ajax/libs/d3/7.9.0/d3.min.js; reads CSS variables for every color; responds to 'themechange' and resize; the full control set, label placement rule, regression with rate in words and a 90% CI, mobile reflow with a bottom sheet for controls under 768px, tap tooltips, a Table view, and a Data download), the three live stat cards with the unit switch (Increase/year | Doubling time | OOM/year) that rewrites number and sentence, tools/epoch_chart.py (matplotlib twin rendered to assets/img/epoch/notable-models-mpl.png at 2x; create a venv in the scratchpad dir /private/tmp/claude-501/-Users-joseantonioochoa-CC-Projects-2027-Portfolio/54ad3109-b727-4ebe-b0ff-0f941533ff50/scratchpad/venv and pip install matplotlib pandas there; the PNG must use the SPEC series colors and the site typography feel — use a clean sans available to matplotlib, light paper background), and the page work/epoch-explorer/index.html with all five sections and the attribution block. Copy the skeleton from site/templates/page.html if it exists when you reach the page step; otherwise write the head/header/footer exactly as SPEC §4 describes and leave a note so the orchestrator can swap in the canonical shell. Read the dataviz skill references first: /private/tmp/claude-501/bundled-skills/2.1.319/039104e58e73864ab5cfa2728a71e274/dataviz/references/{marks-and-anatomy,interaction,anti-patterns}.md.
Tone of section 1: neutral, factual observations with the date, respectful of a product you admire; this page will be read by the people who built it. Research notes with the observations are in research/epoch-ai.md §3.2–3.5 and research/epoch-visual-language.md (do NOT reuse Epoch's palette or fonts).
Serve on port 8789, screenshot the page at 390 and 1440 in light and dark into lanes/shots/A4/, Read the PNGs, and iterate until the chart is beautiful and the mobile version truly reflows (no horizontal scroll, labels legible, controls reachable). Write lanes/notes/A4.md including the computed growth rates and CIs so the copy can quote them.
A5Copy for every page
You are build lane A5 "copy" (model: Opus 5.5). Read "/Users/joseantonioochoa/CC Projects/2027 Portfolio/BRIEF.md" and then "/Users/joseantonioochoa/CC Projects/2027 Portfolio/SPEC.md" in full before doing anything. The spec is the contract: file ownership, tokens, markup, chart API, definition of done. Research material lives in "/Users/joseantonioochoa/CC Projects/2027 Portfolio/research/" (read what you need; never modify it). Write only inside the paths the spec assigns to your lane plus lanes/notes/<lane>.md and lanes/shots/<lane>/. Work autonomously; do not ask questions — decide, note the decision, continue. Quality bar: this portfolio must impress the Head of Design at Epoch AI; typography, spacing, and chart craft matter more than feature count. Finish by printing DONE.
You are the writer. Produce the final copy for every page as Markdown in "/Users/joseantonioochoa/CC Projects/2027 Portfolio/content/": home.md, bakery-orders.md, design-system.md, epoch-explorer.md (sections 1, 3 copy template, 5, attribution — the chart itself is built by another lane), process.md, about.md, plus meta.md (title + meta description + og text per page, ≤60/≤155 chars). Follow SPEC §1 (voice) and §7 (structure) exactly, section by section, with the figure slots marked as `{{figure:timeline}}` etc., media slots as `{{media:bakery/storefront-landing-1440.jpg | caption}}` (use the filenames you find in research/assets/*; the data lane is converting some PNGs to JPG — write the base name and the page lanes will match extensions), quote blocks with their source path, and HTML tables as Markdown tables. Pull every number and quote from research/ (bakery-case-study.md is 2,158 lines — read the parts you need: Parts 1, 4, 5 and the "Most quotable numbers"; bakery-metrics.json; design-system-case.md; figma-cfc-system.md; ai-playbook-summary.md; jose-profile.md; other-projects.md; epoch-ai.md §1–§4 and §6). Verify each number against the source before writing it; cite the path in an HTML comment after any claim a reader might doubt. Write in José's first person; he is a designer, not a developer, and the copy should say so plainly once ("I don't write the code. I specify it, direct the agents that do, and prove it works."). For Home, propose three headline options in an HTML comment and put your pick in the text. Keep paragraphs ≤3 sentences; section intros ≤60 words; the whole bakery page under 1,800 words of prose excluding tables and captions; home under 450; process under 1,000; design system under 1,100; about under 350. Headings are claim-first sentences. No exclamation marks. Spell José. Use "the deli lead", never a staff name; no customer or household data. End with lanes/notes/A5.md listing any fact you could not verify and chose to omit.
Phase B · Pages
Four page lanes that assemble Phase A’s parts into finished pages.
B1Bakery case-study page
You are build lane B1 "bakery page" (model: Opus 5.5). Read "/Users/joseantonioochoa/CC Projects/2027 Portfolio/BRIEF.md", then "/Users/joseantonioochoa/CC Projects/2027 Portfolio/SPEC.md" in full, then the Phase A notes in "/Users/joseantonioochoa/CC Projects/2027 Portfolio/lanes/notes/" (A1 shell, A2 charts API, A3 data+images manifest at site/assets/img/MANIFEST.md, A4 epoch, A5 copy). Phase A built the design system (site/assets/css/*), the canonical skeleton (site/templates/page.html), the chart system (site/assets/js/charts/ — read the API doc at the top of index.js and site/charts-demo.html for working examples), the data files (site/data/*.json), optimized images (site/assets/img/*), inline SVG diagrams (site/assets/svg/*), and the final copy (content/*.md). Your job is to assemble a finished page from those parts: copy templates/page.html verbatim as the shell, pour in the copy from content/<page>.md faithfully (do not rewrite it; fix only typos or a number that contradicts site/data), place every {{figure:…}} as the full figure anatomy with the right data-chart and data-src, every {{media:…}} as a .media frame with the matching optimized image (match base names; check MANIFEST.md), quotes as .quote with cite, tables as styled tables, and the TOC with one entry per H2. Write only your page files plus lanes/notes/<lane>.md and lanes/shots/<lane>/. Do not modify CSS/JS owned by other lanes; if you truly need a style, add a <style> block scoped to your page and note it. Serve the site root with python3 -m http.server on your port, screenshot your page at 390 and 1440 in light and dark (headless Chrome, full height), Read the PNGs, and fix overflow, collisions, rhythm, and anything that looks unfinished. Do not ask questions; decide and note. Finish by printing DONE.
Page: site/work/bakery-orders/index.html from content/bakery-orders.md, SPEC §7. Port 8790. This is the flagship: hero with the two storefront screenshots (browser + phone) side by side, sticky TOC, eight figures (timeline, growth, issues, heat, rounds, types, models, loc), the architecture SVG (assets/svg/bakery-architecture-*.svg inline; show wide ≥600px, narrow below), the orchestration SVG, the three-context token diagram (build a small inline SVG or a three-column .steps if no SVG exists), media rows for Figma and outcome screenshots, the launch-week table, the keep/change/drop lists, and case-nav to /work/design-system/. Pace the page: alternate text, figure, media; never two dense blocks in a row. Make the mobile reading experience excellent.
B2Design-system page
You are build lane B2 "design-system page" (model: Opus 5.5). Read "/Users/joseantonioochoa/CC Projects/2027 Portfolio/BRIEF.md", then "/Users/joseantonioochoa/CC Projects/2027 Portfolio/SPEC.md" in full, then the Phase A notes in "/Users/joseantonioochoa/CC Projects/2027 Portfolio/lanes/notes/" (A1 shell, A2 charts API, A3 data+images manifest at site/assets/img/MANIFEST.md, A4 epoch, A5 copy). Phase A built the design system (site/assets/css/*), the canonical skeleton (site/templates/page.html), the chart system (site/assets/js/charts/ — read the API doc at the top of index.js and site/charts-demo.html for working examples), the data files (site/data/*.json), optimized images (site/assets/img/*), inline SVG diagrams (site/assets/svg/*), and the final copy (content/*.md). Your job is to assemble a finished page from those parts: copy templates/page.html verbatim as the shell, pour in the copy from content/<page>.md faithfully (do not rewrite it; fix only typos or a number that contradicts site/data), place every {{figure:…}} as the full figure anatomy with the right data-chart and data-src, every {{media:…}} as a .media frame with the matching optimized image (match base names; check MANIFEST.md), quotes as .quote with cite, tables as styled tables, and the TOC with one entry per H2. Write only your page files plus lanes/notes/<lane>.md and lanes/shots/<lane>/. Do not modify CSS/JS owned by other lanes; if you truly need a style, add a <style> block scoped to your page and note it. Serve the site root with python3 -m http.server on your port, screenshot your page at 390 and 1440 in light and dark (headless Chrome, full height), Read the PNGs, and fix overflow, collisions, rhythm, and anything that looks unfinished. Do not ask questions; decide and note. Finish by printing DONE.
Page: site/work/design-system/index.html from content/design-system.md, SPEC §7. Port 8791. Build the naming-rule diagram as inline SVG (theme.json key → emitted CSS variable → Figma variable with its WEB code syntax; three columns, arrows, monospace labels) and the modes diagram (Mobile = clamp min, Desktop = clamp max, a fluid curve between); figures ds-commits and tokens; Figma media row (cover, colors, typography, buttons, token board, changelog from assets/img/figma or assets/img/theme); live-site media (home 1440 browser + 390 phone); an "honest state" callout; case-nav prev /work/bakery-orders/ next /work/epoch-explorer/.
B3Process page + prompts
You are build lane B3 "process page" (model: Opus 5.5). Read "/Users/joseantonioochoa/CC Projects/2027 Portfolio/BRIEF.md", then "/Users/joseantonioochoa/CC Projects/2027 Portfolio/SPEC.md" in full, then the Phase A notes in "/Users/joseantonioochoa/CC Projects/2027 Portfolio/lanes/notes/" (A1 shell, A2 charts API, A3 data+images manifest at site/assets/img/MANIFEST.md, A4 epoch, A5 copy). Phase A built the design system (site/assets/css/*), the canonical skeleton (site/templates/page.html), the chart system (site/assets/js/charts/ — read the API doc at the top of index.js and site/charts-demo.html for working examples), the data files (site/data/*.json), optimized images (site/assets/img/*), inline SVG diagrams (site/assets/svg/*), and the final copy (content/*.md). Your job is to assemble a finished page from those parts: copy templates/page.html verbatim as the shell, pour in the copy from content/<page>.md faithfully (do not rewrite it; fix only typos or a number that contradicts site/data), place every {{figure:…}} as the full figure anatomy with the right data-chart and data-src, every {{media:…}} as a .media frame with the matching optimized image (match base names; check MANIFEST.md), quotes as .quote with cite, tables as styled tables, and the TOC with one entry per H2. Write only your page files plus lanes/notes/<lane>.md and lanes/shots/<lane>/. Do not modify CSS/JS owned by other lanes; if you truly need a style, add a <style> block scoped to your page and note it. Serve the site root with python3 -m http.server on your port, screenshot your page at 390 and 1440 in light and dark (headless Chrome, full height), Read the PNGs, and fix overflow, collisions, rhythm, and anything that looks unfinished. Do not ask questions; decide and note. Finish by printing DONE.
Page: site/process/index.html from content/process.md, SPEC §7, plus site/process/prompts/index.html listing the real lane prompts of THIS site's build (copy the text of lanes/prompts/*.md into one page as collapsible <details> blocks rendered in <pre> with the lane id, model and phase; also the SPEC.md as a details block — this is evidence of how the site itself was built). Port 8792. Figures: rounds, models, build-log (data/build-log.json; if the orchestrator has extended it, use as is). Evidence panel: a real ticket-prompt excerpt and a hand-off excerpt — take them verbatim from research/bakery-case-study.md Part 4 (they are quoted there with paths), 10–15 lines each, in <pre class="excerpt"> with a mono caption naming the path. The loop diagram: inline SVG or an ordered .steps with arrows. Keep/change/drop as three columns on desktop, stacked on mobile.
B4Home, About, 404
You are build lane B4 "home + about + 404" (model: Opus 5.5). Read "/Users/joseantonioochoa/CC Projects/2027 Portfolio/BRIEF.md", then "/Users/joseantonioochoa/CC Projects/2027 Portfolio/SPEC.md" in full, then the Phase A notes in "/Users/joseantonioochoa/CC Projects/2027 Portfolio/lanes/notes/" (A1 shell, A2 charts API, A3 data+images manifest at site/assets/img/MANIFEST.md, A4 epoch, A5 copy). Phase A built the design system (site/assets/css/*), the canonical skeleton (site/templates/page.html), the chart system (site/assets/js/charts/ — read the API doc at the top of index.js and site/charts-demo.html for working examples), the data files (site/data/*.json), optimized images (site/assets/img/*), inline SVG diagrams (site/assets/svg/*), and the final copy (content/*.md). Your job is to assemble a finished page from those parts: copy templates/page.html verbatim as the shell, pour in the copy from content/<page>.md faithfully (do not rewrite it; fix only typos or a number that contradicts site/data), place every {{figure:…}} as the full figure anatomy with the right data-chart and data-src, every {{media:…}} as a .media frame with the matching optimized image (match base names; check MANIFEST.md), quotes as .quote with cite, tables as styled tables, and the TOC with one entry per H2. Write only your page files plus lanes/notes/<lane>.md and lanes/shots/<lane>/. Do not modify CSS/JS owned by other lanes; if you truly need a style, add a <style> block scoped to your page and note it. Serve the site root with python3 -m http.server on your port, screenshot your page at 390 and 1440 in light and dark (headless Chrome, full height), Read the PNGs, and fix overflow, collisions, rhythm, and anything that looks unfinished. Do not ask questions; decide and note. Finish by printing DONE.
Pages: finalize site/index.html (the shell lane left a working draft — replace its placeholder copy with content/home.md exactly, keep its structure where it already matches SPEC §7 Home, make sure the hero figure (timeline) renders, the four stat cards count up, the three selected-work cards and two more-work cards have real images from assets/img and real links, and the How-I-work and contact blocks are complete), site/about/index.html from content/about.md (timeline component, practicalities, contact; no photo), and site/404.html (short, with links home). Port 8793. Also apply content/meta.md titles/descriptions to these three pages. Check every internal link on these pages resolves to an existing file.
Phase C · QA
One audit lane across every page, width and theme.
C1QA audit + fixes
You are QA lane C1 (model: Opus 5.5). Read "/Users/joseantonioochoa/CC Projects/2027 Portfolio/SPEC.md" (§3–§6, §10) and all lanes/notes/*.md. The site is in "/Users/joseantonioochoa/CC Projects/2027 Portfolio/site/". Serve it on port 8794 and audit EVERY page (/, /work/bakery-orders/, /work/design-system/, /work/epoch-explorer/, /process/, /process/prompts/, /about/, /styleguide/, /charts-demo.html, /404.html) at 390, 768 and 1440 in light and dark: screenshots into lanes/shots/C1/ (Read each PNG), plus a scripted pass with headless Chrome or node (if puppeteer is available via npx, use it; otherwise use Chrome --dump-dom and grep) for: console errors, failed requests (404 images/scripts/data), horizontal overflow at 390 (document.documentElement.scrollWidth > innerWidth), missing alt, missing <title>/meta description, duplicate ids, links that do not resolve to a file in site/, figures whose chart container stayed empty, headings order, focus visibility, and color contrast of body/meta text on both themes (compute with a small script). Then FIX what you find directly in the page files and in the CSS/JS when the fix is clearly a bug (keep edits minimal and note every file you touched), re-run, and write lanes/notes/C1.md as a table: issue · page · severity · fixed? · how. Also produce lanes/notes/C1-lighthouse.md if `npx lighthouse` works (performance/a11y/best-practices/SEO for / and the bakery page, mobile). Do not redesign anything; consistency and correctness only. Print DONE.
Phase D · Figma
One lane that mirrors the finished site into a Figma file.
D1Figma file (system + screens)
You are lane D1 "Figma" (model: Opus 5.5). Read "/Users/joseantonioochoa/CC Projects/2027 Portfolio/BRIEF.md" and "/Users/joseantonioochoa/CC Projects/2027 Portfolio/SPEC.md" §3–§6, then lanes/notes/A1.md. The portfolio website is finished at "/Users/joseantonioochoa/CC Projects/2027 Portfolio/site/" (serve with python3 -m http.server 8795 --directory "<site>"). Your job: represent it in Figma as a proper design file, in the blank file José provided: https://www.figma.com/design/z1txliHgK4KPLMcCOR9zDJ/Untitled?node-id=0-1 (fileKey z1txliHgK4KPLMcCOR9zDJ). Use the Figma MCP tools (mcp__claude_ai_Figma__*; load schemas with ToolSearch "select:…" first). MANDATORY: load the skill /figma-generate-library (or read skill://figma/figma-generate-library/SKILL.md via the MCP resource) and /figma-use before calling use_figma; call mcp__claude_ai_Figma__create_session with the fileKey and a description first, and reuse its sessionId. Build, in this order, checking with get_screenshot after each page: 1. Rename the file to "José Ochoa — Portfolio 2026" (if the API allows) and create pages: "📘 Cover", "01 Foundations", "02 Components", "03 Screens", "04 Charts", "🗓 Changelog". 2. Foundations: variable collections mirroring site/assets/css/tokens.css exactly — "Color" with Light/Dark modes (paper, paper-2, paper-3, ink, ink-2, ink-3, line, accent, accent-ink, accent-soft, series-1…8, good/warn/bad), "Space" (space-1…10), "Radius", and text styles for the type scale (Instrument Serif display/h1/h2, Geist body/small/h3, Geist Mono meta) with Mobile/Desktop modes as the clamp endpoints (min at 390, max at 1440). Every variable's description = the CSS custom property name it mirrors (e.g. "--accent"), following José's own naming rule from his CFC System file. Lay out a Foundations canvas: color swatches by role with hex and token name, type specimens, spacing scale, radius. 3. Components (auto-layout everywhere, variables bound for fills/strokes/radius/padding): Button (primary/ghost × default/hover/focus), Eyebrow, Stat card, Figure frame (header/chart area/caption/footer with Table/Data actions), Media frame (browser/phone), Quote, Callout, Tag, Work card, Site header (desktop + mobile), Footer, TOC rail. Use component properties for text and booleans. 4. Screens: Home at 1440 and 390, Bakery case study at 1440 (top ~2 viewports) and 390, Epoch explorer at 1440 and 390 — rebuilt from the live HTML/CSS with the components above (use get_design_context-free approach: read the HTML and CSS files directly, or use the figma-generate-design skill's code-to-design flow). Charts inside screens can be placed as image fills from screenshots exported with headless Chrome (export the figure elements at 2x) — label them "chart (image placeholder · live chart in code)". 5. Charts page: the eleven figure screenshots at 2x from charts-demo.html in a grid with their titles and the renderer name, plus the series palette swatches and a short "chart grammar" note. 6. Cover: title, "Built 2026-11-07/08 · code-first, mirrored to Figma the same session", the naming rule, pages list. Changelog: one dated entry describing this build. Constraints: Do not touch any other Figma file. If a tool call fails twice, simplify (fewer variants) and record it in lanes/notes/D1.md. Keep going until all six pages exist and look clean in get_screenshot. Write lanes/notes/D1.md with the file URL, node ids of the key frames, counts (variables, styles, components, screens) and anything you could not do. Print DONE.