Provenance
How this site was built, in full
The posting asks for engineers who use AI coding tools to work efficiently. Rather than assert it: here is the plan this site was written from, every issue it was cut into, the agent session behind each change, and the repository’s own history — rendered here, because the repository is private.
Where this stands today
- The exporter, the redaction gate, this page and their tests are built. The sessions themselves are not exported yet.
- The one transcript below is a labelled sample: a synthetic session, written by hand, that exists to prove the pipeline renders. It is not a record of anything that happened.
- Real transcripts ship only after Nick has read each one end to end. That gate is a person, not a script, and it has not been walked.
The plan
One session read the posting, read the résumé, surveyed a year of repositories and wrote the issues. It is the first thing that will be published here, and it is the one worth reading first: everything below it is that plan being executed.
That session is not published yet. It runs through the same exporter and the same redaction gate as every other transcript, and it ships when it has been read end to end — not before.
The build
For each issue: the agent lane it was routed to, the session transcript, the pull request it opened and how long it took. The table is generated from the transcript manifest and the repository snapshot, so a row cannot claim a session or a pull request that does not exist.
Issue, lane, pull request, session
One row per published session. Every cell is read from the manifest the exporter wrote or the snapshot the collector took.
| Issue | Lane | Pull request | Session | Took |
|---|---|---|---|---|
| #24 Provenance: publish the sessions that built this site | Opus · medium | None | Sample session — the exporter's own fixtureSample | 12 min |
The issues
Every issue in this repository, with the checklists it had to satisfy — written before a line of the site existed. An issue whose body carries personal contact details ships as a title and a date with the reason printed where the body would have been.
The work was scoped into these before any of it was built. The checkboxes are the issue author’s, not a progress bar — an unticked box on a shipped issue means the box was never ticked, and that is left as it is.
#1 Epic: noteefy.nicholastanderson.com — plan, content architecture, constraints
OpenBody withheld. The epic carries the résumé’s phone number.
#2 Scaffold the Astro site and CI gates
ClosedStand up the site skeleton and the CI gates that every later issue depends on. Nothing user-visible ships here — this is the harness.
What it had to satisfy
Acceptance criteria
- npm ci && npm run build succeeds from a clean clone with no environment variables set.
- npm test runs and passes, and the repo contains at least one test written before its
Acceptance criteria
- CI fails the PR if typecheck, lint, tests, or the build fail.
- No AWS credentials or network access are needed to build or test.
#3 CDK site stack: S3 + CloudFront + ACM + Route 53
ClosedAll AWS resources for noteefy.nicholastanderson.com as a CDK stack, so the site is reproducible from this repo alone. Mirrors galesburg-mens-all-city/infra, which already does exactly this for…
What it had to satisfy
Tests (TDD — assertions first)
- The bucket blocks all public access and is encrypted.
- The distribution's aliases contain exactly noteefy.nicholastanderson.com.
- Viewer protocol policy is redirect-to-https.
- Both a 403 and a 404 error response map to /404.html.
- Both an A and an AAAA record target the distribution.
- The template contains no AWS::Route53::HostedZone resource.
Acceptance criteria
- cd infra && npm ci && npx cdk synth SiteStack succeeds.
- npm test in infra/ passes.
- CI runs cdk synth on every PR so a broken stack can't merge.
#4 GitHub Actions deploy via OIDC — no stored AWS keys
ClosedDeploy on push to main, with no long-lived AWS keys anywhere. GitHub Actions assumes an IAM role via OIDC. Same shape as galesburg-mens-all-city.
What it had to satisfy
Tests
- Assertions test: the role's trust policy StringLike on :sub pins the repo and the
Tests
- Assertions test: the role's inline policy grants nothing outside role/cdk-.
Acceptance criteria
- Push to main deploys and invalidates CloudFront with zero stored secrets — only the
Acceptance criteria
- A push to any branch other than main cannot assume the role.
#5 Disaster recovery: rebuildable from the repo alone + runbook
ClosedThe site has to be rebuildable from this repo alone after a total loss of the AWS account. This issue is the proof and the documentation of that claim.
What it had to satisfy
Acceptance criteria
- A reader who has never seen the repo can go from "new AWS account + this repo" to a live
Acceptance criteria
- Nothing in the runbook says "click" in the AWS console except for the four steps above.
- Verified by actually walking the runbook and noting anything that turned out to be missing.
#6 Playwright E2E harness + post-deploy production smoke
ClosedSet up Playwright so that every later section issue can add E2E coverage for its user-facing behavior, and so production is smoke-tested after every deploy.
What it had to satisfy
Acceptance criteria
- npm run e2e passes locally against a clean build with no credentials.
- E2E is a required check on PRs.
- A deliberately broken deploy is caught by the production smoke run.
- Specs live next to the section they cover and are named for user behavior, not components.
#7 Design system: tokens, type scale, primitives, styleguide page
ClosedOne set of tokens and primitives that every section issue builds on, so the page reads as a single designed thing rather than eight stacked sections.
What it had to satisfy
Tests
- Unit test asserting no CSS color literal appears outside the token file.
- E2E: /styleguide renders in light and dark (colorScheme emulation) without overflow.
- E2E: no horizontal page scroll at 375px, 768px, and 1440px.
Acceptance criteria
- Every section issue can be built without inventing a new color, font size, or spacing value.
- Page body never scrolls horizontally at any viewport.
#8 Typed content model with build-time validation
ClosedAll copy and data live in typed content modules, not in markup. The build fails on bad data. This is what lets the content be edited later without touching components — and it's the same "validate at build time, fail…
What it had to satisfy
Tests (TDD)
- Schema rejects a role with an end date before its start date.
- Schema rejects a project link that isn't https.
- Production build fails when any TODO marker is still present; dev build renders it.
- Every StackItem has a non-empty justification string.
Acceptance criteria
- No user-visible string lives in a .astro file.
- npm run build with deliberately corrupted content fails with a message that names the
#9 Resume content: encode every element as typed data
ClosedEncode the complete resume as content data. Nick's instruction: every element of the resume is on the site. The presentation is a later issue; this is the source of truth.
What it had to satisfy
Acceptance criteria
- Every element above exists in the content data, including the partial M.S. and the expired
Acceptance criteria
- A test asserts the set of roles in the data matches the nine above by title and dates.
- Dates are machine-readable (YYYY-MM) and formatted for display in one place.
#10 Shipped-work content: aggregate stats across a year of building
ClosedThe evidence layer. Nick's direction (2026-09-12): aggregate stats about the whole body of work, not a repo-by-repo tour. One year, one set of numbers, then what those numbers mean.
What it had to satisfy
Method — the numbers must be reproducible
- A committed script (tools/stats/) derives every figure from the repositories and emits
Method — the numbers must be reproducible
- Committed output, with the derivation date, so the site still builds from a clean clone
Method — the numbers must be reproducible
- Each figure carries a one-line definition — "test file" and "line of code" are only
Acceptance criteria
- Every published figure is produced by the committed script, not copied from this issue.
- Test asserting the rendered figures match the generated JSON exactly.
- No figure appears without its definition available to the reader.
#11 Stack-fit content: honest strong / adjacent / ramp ledger
ClosedThe honest ledger: where Nick is strong against Noteefy's stack, and where he'd ramp — with the adjacent experience that makes each ramp short. This section is the biggest differentiator on the page, because almost no…
What it had to satisfy
Acceptance criteria
- Every item in Noteefy's published stack appears exactly once and is classified.
- Test: no StackItem has an empty justification; every strong item references a project
Acceptance criteria
- Run the final copy past Nick before it ships — this section is his voice more than any other.
#12 Hero section + Landmand photo slot
ClosedThe top of the page. A hiring manager decides in about eight seconds whether to keep reading, so this has to land the whole thesis at a glance.
What it had to satisfy
Tests
- E2E @smoke: the <h1> contains "Nick Anderson" and the primary action is a mailto: to
Tests
- E2E: the hero contains no link to github.com and no calendly.com link.
- E2E: the photo has non-empty alt text and resolved dimensions (guards against layout shift).
- E2E: at 375px, 768px and 1440px the callout's arrow tip sits within the hat's bounding box.
Tests
- E2E: the callout overlay is aria-hidden and contributes nothing to the accessible name.
- E2E: hero is legible with no horizontal scroll at 375px and 1440px, light and dark.
- Unit: production build fails while the photo placeholder is still in place.
#13 "The case" section — three cards
ClosedThree cards, immediately under the hero, making the argument before anyone scrolls far.
What it had to satisfy
Tests
- E2E: all three cards render, and each in-page anchor scrolls to a section that exists.
- E2E: cards stack cleanly at 375px without clipping.
#14 Landmand section — the story and the photo
ClosedThe emotional center of the page: the Landmand round, and Noteefy's part in it.
What it had to satisfy
Still needed from Nick
- The file itself, saved to site/src/assets/landmand-hat.jpg.
- A decision about his daughter appearing on a public, indexed page. She's clearly
Tests
- E2E: section renders with the photo and non-empty story copy.
- Unit: production build fails while the story is a TODO.
#15 Shipped-work section — aggregate stat band, not a card grid
ClosedRender the aggregate evidence. Nick's direction (2026-09-12): stats about the whole body of work, not a grid of project cards.
What it had to satisfy
Tests
- Unit: every rendered figure equals its value in the generated stats JSON. This is the guard
Tests
- Unit: the product count in the copy equals the number of products in the data — no
Tests
- E2E: the stat band reflows without clipping at 375px, 768px and 1440px.
- E2E: every outbound product link is https and no link points at github.com.
- Scheduled (not per-PR) link check that the five live sites return 2xx, so a third-party
#16 "How I work" section — AI-native development, with receipts
ClosedThe JD asks for "experience using AI coding tools to work efficiently." Most applicants will assert it. This section shows the method, concretely, and this repo is itself the demonstration.
What it had to satisfy
Tests
- E2E: section renders and its outbound links resolve.
#17 Stack-fit section — strong / adjacent / ramp
ClosedRender the strong / adjacent / ramp ledger. The section that makes the rest of the page credible.
What it had to satisfy
Tests
- E2E: every technology from Noteefy's published stack appears on the page exactly once.
Tests
- E2E: every "strong" item's link resolves to a section on the page.
- E2E: readable in both themes with no truncated justifications at 375px.
#18 Resume section — full timeline, designed, printable
ClosedThe full resume on the page — every element from the PDF — designed as a career timeline rather than a reformatted Word document. Nick's direction: all of it is on the site, and the presentation is free to depart from a…
What it had to satisfy
Tests
- Unit: all nine roles render, in reverse-chronological order, with the exact titles and
Tests
- Unit: education and certification entries all render, including the partial degree.
- E2E: with emulateMedia({ media: 'print' }), the nav, photo and CTAs are hidden and the resume
#19 Close / CTA section and section nav
ClosedThe close, plus the nav that holds the page together.
What it had to satisfy
Tests
- E2E @smoke: the primary action is a mailto: to nick@nicholastanderson.com.
- E2E: the whole page contains zero links to github.com and zero to calendly.com.
- E2E: the mailto: link is exactly nick@nicholastanderson.com — the test exists to catch
Tests
- The address must be live and receiving (#25) before launch; a dead mailto: on an
Tests
- E2E: every nav item scrolls to a section that exists, and the active state follows.
- E2E: the whole page is reachable by keyboard alone; skip link works.
#20 SEO, Open Graph, favicon, sitemap
ClosedThis link gets pasted into a Slack thread and a calendar invite. What unfurls there is part of the first impression.
What it had to satisfy
Tests
- Unit: OG and Twitter tags present with absolute URLs; no relative image href.
- E2E: the OG image URL returns 200 and is exactly 1200×630.
- E2E: /sitemap.xml returns 200, lists the canonical URL, and does not list /styleguide.
- Visual check of the unfurl in Slack and iMessage before launch — automated tests won't
#21 Accessibility and performance budgets enforced in CI
ClosedA page arguing for engineering quality has to be built to a standard. Gate it in CI so it stays that way as sections land.
What it had to satisfy
Acceptance criteria
- A PR that introduces a serious axe violation or blows a budget goes red.
- Budget numbers live in a committed config, not in a workflow step, so they're reviewable.
#22 404 page
ClosedThe CDK stack maps both 403 and 404 to /404.html, so the page has to exist and be good.
What it had to satisfy
Tests
- E2E: a random nonexistent path returns HTTP 404 (not 200) and renders the 404 page.
- E2E: the same for a path that would 403 at the S3 origin, proving the CloudFront error
Tests
- The 404 path is part of the post-deploy production smoke run.
#23 README, launch checklist, go live
OpenBody withheld. The launch checklist carries the recruiter’s booking link and a private decision about the photo.
#24 Provenance: publish the sessions that built this site
ClosedNoteefy's posting names Cursor, Greptile, ChatGPT and Claude in its stack and asks for engineers who use AI coding tools to work efficiently. The strongest possible answer to that is not a paragraph claiming it — it's…
What it had to satisfy
Tests
- Exporter unit tests (TDD): a JSONL fixture containing a fake AWS key, an absolute home
Tests
- Unit: the generated table's rows match the manifest exactly.
- E2E: every transcript page renders, is readable at 375px, and its tool-call sections expand
Tests
- E2E: every link in the build table resolves.
- CI: the redaction scan runs on every PR, not just at export time.
Acceptance criteria
- A reader can go from "How I work" to a full session transcript in two clicks.
- The site still builds from a clean clone with no ~/.claude directory present.
- Nick has read every published transcript and signed off.
#25 Manual: set up nick@nicholastanderson.com in Google Workspace and on phone
ClosedBody withheld. The mail-setup issue is entirely about personal addresses.
#53 CDN: immutable caching for fingerprinted assets, and HTTP/3 on CloudFront
OpenTwo CloudFront/S3 changes that make the site faster for real visitors. Neither moves the Lighthouse CI number — that runs against a local server with simulated throttling, so the CDN isn't in its path (see #51, where…
What it had to satisfy
Tests (TDD — assertions first)
- The distribution's HttpVersion is http2and3.
- The deployment covering astro/ sets Cache-Control to public, max-age=31536000, immutable.
- The deployment covering everything else sets public, max-age=0, must-revalidate, and HTML is never in the long-lived deployment.
- The two deployments can't prune each other's files — a test that fails if both are left at prune: true with overlapping scope.
- Existing assertions still pass: private bucket, redirect-to-HTTPS, 403/404 → /404.html, A + AAAA records, no AWS::Route53::HostedZone.
Acceptance criteria
- cdk synth passes in CI.
- After deploy, curl -sI https://noteefy.nicholastanderson.com/astro/<any file> shows the immutable header, and curl -sI https://noteefy.nicholastanderson.com/ shows max-age=0.
- curl -sI --http3 https://noteefy.nicholastanderson.com/ succeeds (or the response carries an alt-svc: h3 header).
- A second deploy doesn't delete any file the site needs — load /, /build/ and /404 after it.
- Post-deploy production smoke (#6) passes.
#54 Drop the explicit mention of any other projects on the site. Only include high-level, rolled up stats about the overall work.
Open
The repo
The commit history and every CI run, rendered on this site rather than linked to a code host a reader cannot open. What is missing from it is as honest as what is in it — see the caveats.
Commits on the default branch and every completed workflow run, from the committed snapshot. No link on this page goes to a code host: the repository is private, and a link a reader cannot open is worse than no link.
27
Commits on main
26
Pull request
70
Workflow runs
0
Human review comments
Commits on main
3e50c96Trust GitHub's id-qualified OIDC subject in the deploy role (#52)Sep 14, 2026277d91aAdd the Landmand section: the story, and the photo that wasn't taken (#14) (#50)Sep 14, 2026949182cTemporarily publish the personal gmail address until Workspace is live (#49)Sep 14, 2026fdff5b0Add the hero, with the Landmand photo slot and its callout (#12) (#43)Sep 12, 20261879758Publish the sessions that built this site: the /build section (#48)Sep 12, 2026dfdebf9Add the close and the section nav: one action, and a way around the page (#47)Sep 12, 2026c138504Add a branded 404 page (#46)Sep 12, 2026fb22929Add the shipped-work section: a stat band, not a card grid (#45)Sep 12, 2026aa0ee63Add the resume section: the full timeline, designed and printable (#44)Sep 12, 20268a743c9Add the stack-fit section: the honest ledger, tier by tier (#42)Sep 12, 20265119fcbAdd "the case": three cards under the hero (#41)Sep 12, 2026e538c2dAdd the "how I work" section, with receipts read from the derived stats (#40)Sep 12, 20263c13882Give the washes an ink that can sit on them (#39)Sep 12, 20261f24f4aRaise the subtle text and dark accent tokens to 4.5:1 (#38)Sep 12, 2026b3178a7Add the design system: tokens, primitives and a styleguide page (#29)Sep 12, 20268fe8d59Generate the preview card, favicons and sitemap from the content (#37)Sep 12, 202682ef8a0Gate accessibility and performance budgets in CI (#36)Sep 12, 2026edafd6aDerive the aggregate shipped-work figures from the repositories (#35)Sep 12, 202691fb0d4Document the cold-start rebuild in docs/RUNBOOK.md (#34)Sep 12, 202615a89bcPopulate the stack-fit ledger with real strong/adjacent classifications (#33)Sep 12, 20260e517caDeploy from GitHub Actions via OIDC, with no stored AWS keys (#32)Sep 12, 20265949099Populate resume content data from the real résumé (#31)Sep 12, 2026d2406b3Add a Playwright E2E harness and a production smoke run (#30)Sep 12, 2026ebf73baAdd the CDK site stack for noteefy.nicholastanderson.com (#28)Sep 12, 2026
3 more not shown
Workflow runs
- successCI · pull_request · photo/landmand-hat-strippedSep 14, 2026 · 8m 45s
- cancelledCI · pull_request · photo/landmand-hat-strippedSep 14, 2026 · 5m 23s
- successDeploy · push · mainSep 14, 2026 · 17m 16s
- successDeploy · workflow_dispatch · mainSep 14, 2026 · 14m 56s
- successCI · pull_request · fix-oidc-immutable-subjectSep 14, 2026 · 6m 41s
- failureCI · pull_request · photo/landmand-hat-strippedSep 14, 2026 · 4m 33s
- failureDeploy · workflow_dispatch · mainSep 14, 2026 · 12m 50s
- failureDeploy · push · mainSep 14, 2026 · 11m 48s
- successCI · pull_request · issue-14-landmand-sectionSep 14, 2026 · 6m 4s
- failureDeploy · push · mainSep 14, 2026 · 6m 40s
- successCI · pull_request · temp-gmail-contact-emailSep 14, 2026 · 5m 49s
- failureDeploy · push · mainSep 12, 2026 · 7m 8s
- successCI · pull_request · claude/issue-12-hero-landmand-photoSep 12, 2026 · 6m 0s
- failureDependabot Updates · dynamic · mainSep 12, 2026 · 1m 6s
- failureDeploy · push · mainSep 12, 2026 · 6m 23s
- successCI · pull_request · claude/issue-24-provenance-buildSep 12, 2026 · 5m 15s
- failureDeploy · push · mainSep 12, 2026 · 4m 52s
- successCI · pull_request · claude/issue-19-close-cta-navSep 12, 2026 · 4m 1s
- failureDeploy · push · mainSep 12, 2026 · 4m 15s
- successCI · pull_request · claude/404-page-22Sep 12, 2026 · 3m 25s
- failureDependabot Updates · dynamic · mainSep 12, 2026 · 1m 13s
- failureDependabot Updates · dynamic · mainSep 12, 2026 · 1m 18s
- failureDependabot Updates · dynamic · mainSep 12, 2026 · 3m 7s
- failureDependabot Updates · dynamic · mainSep 12, 2026 · 1m 6s
46 more not shown
What these figures do not say
- This is a solo repository. Every pull request was opened by an agent and merged on green, which is a claim about the gates rather than about surviving a reviewer.
- There is not one human review comment in it. CI is the reviewer here: typecheck, lint, unit tests, three browsers of end-to-end tests and the accessibility and performance budgets.
- 21 deploy runs failed. The site's AWS account is not stood up yet — the deploy job assumes a role that does not exist, and the runs are left red rather than hidden.
Snapshot taken 2026-09-14 · tools/build-snapshot/collect.mjs