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.

Back to the page

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.

IssueLanePull requestSessionTook
#24 Provenance: publish the sessions that built this siteOpus · mediumNoneSample session — the exporter's own fixtureSample12 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. #1 Epic: noteefy.nicholastanderson.com — plan, content architecture, constraints

    Open

    Body withheld. The epic carries the résumé’s phone number.

  2. #2 Scaffold the Astro site and CI gates

    Closed

    Stand 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. #3 CDK site stack: S3 + CloudFront + ACM + Route 53

    Closed

    All 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. #4 GitHub Actions deploy via OIDC — no stored AWS keys

    Closed

    Deploy 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. #5 Disaster recovery: rebuildable from the repo alone + runbook

    Closed

    The 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. #6 Playwright E2E harness + post-deploy production smoke

    Closed

    Set 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. #7 Design system: tokens, type scale, primitives, styleguide page

    Closed

    One 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. #8 Typed content model with build-time validation

    Closed

    All 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. #9 Resume content: encode every element as typed data

    Closed

    Encode 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. #10 Shipped-work content: aggregate stats across a year of building

    Closed

    The 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. #11 Stack-fit content: honest strong / adjacent / ramp ledger

    Closed

    The 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. #12 Hero section + Landmand photo slot

    Closed

    The 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. #13 "The case" section — three cards

    Closed

    Three 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. #14 Landmand section — the story and the photo

    Closed

    The 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. #15 Shipped-work section — aggregate stat band, not a card grid

    Closed

    Render 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. #16 "How I work" section — AI-native development, with receipts

    Closed

    The 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. #17 Stack-fit section — strong / adjacent / ramp

    Closed

    Render 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. #18 Resume section — full timeline, designed, printable

    Closed

    The 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. #19 Close / CTA section and section nav

    Closed

    The 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. #20 SEO, Open Graph, favicon, sitemap

    Closed

    This 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. #21 Accessibility and performance budgets enforced in CI

    Closed

    A 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. #22 404 page

    Closed

    The 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. #23 README, launch checklist, go live

    Open

    Body withheld. The launch checklist carries the recruiter’s booking link and a private decision about the photo.

  24. #24 Provenance: publish the sessions that built this site

    Closed

    Noteefy'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. #25 Manual: set up nick@nicholastanderson.com in Google Workspace and on phone

    Closed

    Body withheld. The mail-setup issue is entirely about personal addresses.

  26. #53 CDN: immutable caching for fingerprinted assets, and HTTP/3 on CloudFront

    Open

    Two 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.
  27. #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

  1. 3e50c96Trust GitHub's id-qualified OIDC subject in the deploy role (#52)Sep 14, 2026
  2. 277d91aAdd the Landmand section: the story, and the photo that wasn't taken (#14) (#50)Sep 14, 2026
  3. 949182cTemporarily publish the personal gmail address until Workspace is live (#49)Sep 14, 2026
  4. fdff5b0Add the hero, with the Landmand photo slot and its callout (#12) (#43)Sep 12, 2026
  5. 1879758Publish the sessions that built this site: the /build section (#48)Sep 12, 2026
  6. dfdebf9Add the close and the section nav: one action, and a way around the page (#47)Sep 12, 2026
  7. c138504Add a branded 404 page (#46)Sep 12, 2026
  8. fb22929Add the shipped-work section: a stat band, not a card grid (#45)Sep 12, 2026
  9. aa0ee63Add the resume section: the full timeline, designed and printable (#44)Sep 12, 2026
  10. 8a743c9Add the stack-fit section: the honest ledger, tier by tier (#42)Sep 12, 2026
  11. 5119fcbAdd "the case": three cards under the hero (#41)Sep 12, 2026
  12. e538c2dAdd the "how I work" section, with receipts read from the derived stats (#40)Sep 12, 2026
  13. 3c13882Give the washes an ink that can sit on them (#39)Sep 12, 2026
  14. 1f24f4aRaise the subtle text and dark accent tokens to 4.5:1 (#38)Sep 12, 2026
  15. b3178a7Add the design system: tokens, primitives and a styleguide page (#29)Sep 12, 2026
  16. 8fe8d59Generate the preview card, favicons and sitemap from the content (#37)Sep 12, 2026
  17. 82ef8a0Gate accessibility and performance budgets in CI (#36)Sep 12, 2026
  18. edafd6aDerive the aggregate shipped-work figures from the repositories (#35)Sep 12, 2026
  19. 91fb0d4Document the cold-start rebuild in docs/RUNBOOK.md (#34)Sep 12, 2026
  20. 15a89bcPopulate the stack-fit ledger with real strong/adjacent classifications (#33)Sep 12, 2026
  21. 0e517caDeploy from GitHub Actions via OIDC, with no stored AWS keys (#32)Sep 12, 2026
  22. 5949099Populate resume content data from the real résumé (#31)Sep 12, 2026
  23. d2406b3Add a Playwright E2E harness and a production smoke run (#30)Sep 12, 2026
  24. ebf73baAdd the CDK site stack for noteefy.nicholastanderson.com (#28)Sep 12, 2026

3 more not shown

Workflow runs

  1. successCI · pull_request · photo/landmand-hat-strippedSep 14, 2026 · 8m 45s
  2. cancelledCI · pull_request · photo/landmand-hat-strippedSep 14, 2026 · 5m 23s
  3. successDeploy · push · mainSep 14, 2026 · 17m 16s
  4. successDeploy · workflow_dispatch · mainSep 14, 2026 · 14m 56s
  5. successCI · pull_request · fix-oidc-immutable-subjectSep 14, 2026 · 6m 41s
  6. failureCI · pull_request · photo/landmand-hat-strippedSep 14, 2026 · 4m 33s
  7. failureDeploy · workflow_dispatch · mainSep 14, 2026 · 12m 50s
  8. failureDeploy · push · mainSep 14, 2026 · 11m 48s
  9. successCI · pull_request · issue-14-landmand-sectionSep 14, 2026 · 6m 4s
  10. failureDeploy · push · mainSep 14, 2026 · 6m 40s
  11. successCI · pull_request · temp-gmail-contact-emailSep 14, 2026 · 5m 49s
  12. failureDeploy · push · mainSep 12, 2026 · 7m 8s
  13. successCI · pull_request · claude/issue-12-hero-landmand-photoSep 12, 2026 · 6m 0s
  14. failureDependabot Updates · dynamic · mainSep 12, 2026 · 1m 6s
  15. failureDeploy · push · mainSep 12, 2026 · 6m 23s
  16. successCI · pull_request · claude/issue-24-provenance-buildSep 12, 2026 · 5m 15s
  17. failureDeploy · push · mainSep 12, 2026 · 4m 52s
  18. successCI · pull_request · claude/issue-19-close-cta-navSep 12, 2026 · 4m 1s
  19. failureDeploy · push · mainSep 12, 2026 · 4m 15s
  20. successCI · pull_request · claude/404-page-22Sep 12, 2026 · 3m 25s
  21. failureDependabot Updates · dynamic · mainSep 12, 2026 · 1m 13s
  22. failureDependabot Updates · dynamic · mainSep 12, 2026 · 1m 18s
  23. failureDependabot Updates · dynamic · mainSep 12, 2026 · 3m 7s
  24. 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

Back to the page