From c35e2f244f0da21c9c506fc259b96e8bd656498c Mon Sep 17 00:00:00 2001 From: 0thernet Date: Wed, 19 Aug 2026 11:08:51 -0400 Subject: [PATCH] feat: publish appearance backfill queue --- README.md | 2 +- app/appearances/backfill/page.test.tsx | 30 +++++ app/appearances/backfill/page.tsx | 105 +++++++++++++++ app/appearances/page.test.tsx | 2 + app/appearances/page.tsx | 12 +- app/data/page.test.tsx | 3 + app/data/page.tsx | 11 +- app/globals.css | 53 ++++++++ lib/appearance-backfill.test.ts | 43 ++++++ lib/appearance-backfill.ts | 115 ++++++++++++++++ public/research/appearance-backfill.yml | 168 ++++++++++++++++++++++++ 11 files changed, 541 insertions(+), 3 deletions(-) create mode 100644 app/appearances/backfill/page.test.tsx create mode 100644 app/appearances/backfill/page.tsx create mode 100644 lib/appearance-backfill.test.ts create mode 100644 lib/appearance-backfill.ts create mode 100644 public/research/appearance-backfill.yml diff --git a/README.md b/README.md index e9770a3..ce65cae 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ Run the same discovery locally with an explicit date: bun run history:news:pull -- --as-of 2026-08-20 --json-out /tmp/stripe-news.json --markdown-out /tmp/stripe-news.md ``` -The manual [leadership appearance backfill](./.github/workflows/appearance-backfill.yml) searches one bounded calendar window at a time from 2009 onward and uploads a review artifact. It does not edit public data or open issues. The same window can be inspected locally: +The manual [leadership appearance backfill](./.github/workflows/appearance-backfill.yml) searches one bounded calendar window at a time from 2009 onward and uploads a review artifact. It does not edit public data or open issues. A reviewer can normalize a completed run into the public, nonindexable [appearance backfill queue](https://stripehistory.com/appearances/backfill); candidates remain separate from the reviewed appearance corpus until full source review. The same window can be inspected locally: ```sh bun run history:news:pull -- --from 2020-01-01 --as-of 2020-12-31 --monitor exa-stripe-leadership-appearances --json-out /tmp/stripe-appearances-2020.json --markdown-out /tmp/stripe-appearances-2020.md diff --git a/app/appearances/backfill/page.test.tsx b/app/appearances/backfill/page.test.tsx new file mode 100644 index 0000000..ad0cdb0 --- /dev/null +++ b/app/appearances/backfill/page.test.tsx @@ -0,0 +1,30 @@ +import { describe, expect, test } from "bun:test"; +import { renderToStaticMarkup } from "react-dom/server"; + +import AppearanceBackfillPage, { metadata } from "./page"; + +describe("leadership appearance backfill page", () => { + test("keeps unreviewed discovery results public but out of search results", () => { + expect(metadata).toMatchObject({ + alternates: { canonical: "/appearances/backfill" }, + robots: { follow: true, index: false }, + title: "Leadership Appearance Backfill", + }); + }); + + test("renders the complete normalized review queue with provenance", async () => { + const html = renderToStaticMarkup(await AppearanceBackfillPage()); + + expect(html).toContain('

Leadership Appearance Backfill

'); + expect(html).toContain("31 candidates"); + expect(html).toContain("47 raw hits"); + expect(html).toContain("not accepted historical records"); + expect(html.match(/source review needed/gu)).toHaveLength(31); + expect(html).toContain('href="https://www.youtube.com/watch?v=YgYiF86h0yU"'); + expect(html).toContain('href="https://www.youtube.com/watch?v=y_4emS6D4og"'); + expect(html).toContain( + 'href="https://github.com/hraness/stripe-history/actions/runs/32265726670"', + ); + expect(html).not.toContain("OpenAI Co-founder Greg Brockman"); + }); +}); diff --git a/app/appearances/backfill/page.tsx b/app/appearances/backfill/page.tsx new file mode 100644 index 0000000..f2ccac0 --- /dev/null +++ b/app/appearances/backfill/page.tsx @@ -0,0 +1,105 @@ +import { + loadAppearanceBackfill, + type AppearanceBackfill, +} from "@/lib/appearance-backfill"; +import type { Metadata } from "next"; +import Link from "next/link"; + +import { SiteFooter } from "../../site-footer"; +import { SiteHeader } from "../../site-header"; +import { site, socialMetadata } from "../../site"; + +const title = "Leadership Appearance Backfill"; +const description = + "A public review queue of historical Stripe founder and executive podcast, interview, talk, and testimony candidates discovered through bounded Exa search."; + +export const dynamic = "force-static"; + +export const metadata: Metadata = { + title, + description, + alternates: { canonical: "/appearances/backfill" }, + robots: { follow: true, index: false }, + ...socialMetadata(`${title} | ${site.domain}`, description, "/appearances/backfill"), +}; + +export default async function AppearanceBackfillPage() { + const backfill = await loadAppearanceBackfill(); + const candidatesByYear = new Map< + string, + AppearanceBackfill["candidates"][number][] + >(); + for (const candidate of backfill.candidates) { + const year = candidate.published_at.slice(0, 4); + const candidates = candidatesByYear.get(year) ?? []; + candidates.push(candidate); + candidatesByYear.set(year, candidates); + } + + return ( +
+ + +
+
+

{title}

+ {backfill.candidates.length} candidates +
+
+

{description}

+

+ These links are discovery results, not accepted historical records. + Each one still needs canonical deduplication, complete source capture, + role verification, and transcript-grounded editorial review before it + can join the reviewed appearances. +

+

+ The successful backfill run searched + {" "}{backfill.review_window.from.slice(0, 4)} through{" "} + {backfill.review_window.through.slice(0, 4)} and returned{" "} + {backfill.counts.raw_hits} raw hits. Review collapsed{" "} + {backfill.counts.duplicate_variants} duplicate source variants, matched{" "} + {backfill.counts.already_reviewed_variants} variants to existing records, + and excluded {backfill.counts.excluded_hits} unrelated hits. +

+
+
+ {[...candidatesByYear.entries()].map(([year, candidates]) => ( +
+
+

{year}

+ {candidates.length} +
+
    + {candidates.map((candidate) => ( +
  1. +
    +

    + + source review needed +

    +

    {candidate.title}

    +

    + {candidate.participants.join(" · ")} +

    +

    + {new URL(candidate.url).hostname} +

    +
    +
  2. + ))} +
+
+ ))} +
+
+ +
+ ); +} diff --git a/app/appearances/page.test.tsx b/app/appearances/page.test.tsx index 23d1945..e8cf2e7 100644 --- a/app/appearances/page.test.tsx +++ b/app/appearances/page.test.tsx @@ -25,5 +25,7 @@ describe("Stripe leadership appearances", () => { expect(html).toContain('"@type":"CollectionPage"'); expect(html).toContain('"@type":"PodcastEpisode"'); expect(html).toContain('"@type":"VideoObject"'); + expect(html).toContain('href="/appearances/backfill"'); + expect(html).toContain("Review 31 historical appearance candidates"); }); }); diff --git a/app/appearances/page.tsx b/app/appearances/page.tsx index 26f04ff..aa1229e 100644 --- a/app/appearances/page.tsx +++ b/app/appearances/page.tsx @@ -1,4 +1,5 @@ import { loadHistory } from "@/lib/content"; +import { loadAppearanceBackfill } from "@/lib/appearance-backfill"; import { JsonLdScript } from "@hraness/web-discovery/json-ld"; import type { Metadata } from "next"; import Link from "next/link"; @@ -29,7 +30,10 @@ function durationLabel(seconds: number | undefined): string | null { } export default async function AppearancesPage() { - const history = await loadHistory(); + const [history, backfill] = await Promise.all([ + loadHistory(), + loadAppearanceBackfill(), + ]); const sourceById = new Map(history.sources.map((source) => [source.id, source])); return ( @@ -56,6 +60,12 @@ export default async function AppearancesPage() { {history.appearances.length} reviewed

{description}

+

+ + Review {backfill.candidates.length} historical appearance candidates + {" "} + from the public 2009–2026 leadership backfill. +

    {history.appearances.map((appearance) => { const sources = appearance.source_ids.flatMap((sourceId) => { diff --git a/app/data/page.test.tsx b/app/data/page.test.tsx index 228df37..c53ac48 100644 --- a/app/data/page.test.tsx +++ b/app/data/page.test.tsx @@ -37,6 +37,9 @@ describe("Stripe company history dataset", () => { expect(html).toContain('href="/research/sources.yml"'); expect(html).toContain('href="/research/valuations.yml"'); expect(html).toContain('href="/research/appearances.yml"'); + expect(html).toContain('href="/appearances/backfill"'); + expect(html).toContain('href="/research/appearance-backfill.yml"'); + expect(html).toContain("31 candidates"); expect(html).toContain('href="/research/collections.yml"'); expect(html).toContain('href="/research/runs.yml"'); expect(html).toContain(`${history.sources.length} canonical sources`); diff --git a/app/data/page.tsx b/app/data/page.tsx index 3bacf7f..26005c0 100644 --- a/app/data/page.tsx +++ b/app/data/page.tsx @@ -1,4 +1,5 @@ import { loadHistory } from "@/lib/content"; +import { loadAppearanceBackfill } from "@/lib/appearance-backfill"; import { JsonLdScript } from "@hraness/web-discovery/json-ld"; import type { Metadata } from "next"; import Link from "next/link"; @@ -23,7 +24,10 @@ export const metadata: Metadata = { }; export default async function DataPage() { - const history = await loadHistory(); + const [history, appearanceBackfill] = await Promise.all([ + loadHistory(), + loadAppearanceBackfill(), + ]); const countByCategory = new Map( history.categories.map(({ id }) => [ id, @@ -166,6 +170,11 @@ export default async function DataPage() { YAML ·{" "} {history.appearances.length} appearances +
  1. + appearance backfill queue ·{" "} + YAML ·{" "} + {appearanceBackfill.candidates.length} candidates +
  2. research collections YAML
  3. diff --git a/app/globals.css b/app/globals.css index 266ec77..46f725f 100644 --- a/app/globals.css +++ b/app/globals.css @@ -291,6 +291,59 @@ text-align: end; } +.stripe-history-backfill-intro { + color: var(--plain-muted); + display: grid; + gap: 0.7rem; + margin-bottom: 2rem; + max-width: 42rem; +} + +.stripe-history-backfill-intro p, +.stripe-history-backfill-list h3, +.stripe-history-backfill-list p { + margin: 0; +} + +.stripe-history-backfill-years { + display: grid; + gap: 2rem; +} + +.stripe-history-backfill-years > section > .stripe-history-section-heading { + border-top: 2px solid var(--plain-foreground); + margin-bottom: 0; + padding-top: 0.5rem; +} + +.stripe-history-backfill-list { + list-style: none; + margin: 0; + padding: 0; +} + +.stripe-history-backfill-list > li { + border-top: 1px solid var(--plain-line); +} + +.stripe-history-backfill-list article { + padding-block: 0.85rem 1rem; +} + +.stripe-history-backfill-list h3 { + font-family: var(--font-heading); + font-size: var(--text-label); + line-height: 1.35; + margin-top: 0.25rem; +} + +.stripe-history-backfill-list .stripe-history-appearance-participants, +.stripe-history-backfill-source { + color: var(--plain-muted); + font-size: var(--text-caption); + margin-top: 0.3rem; +} + .stripe-history-state button { background: var(--plain-foreground); border: 1px solid var(--plain-foreground); diff --git a/lib/appearance-backfill.test.ts b/lib/appearance-backfill.test.ts new file mode 100644 index 0000000..558b71e --- /dev/null +++ b/lib/appearance-backfill.test.ts @@ -0,0 +1,43 @@ +import { describe, expect, test } from "bun:test"; +import { readFile } from "node:fs/promises"; +import { join } from "node:path"; + +import { parse } from "yaml"; + +import { + AppearanceBackfillFileSchema, + loadAppearanceBackfill, +} from "./appearance-backfill"; + +describe("leadership appearance backfill", () => { + test("accounts for every raw discovery hit without promoting candidates", async () => { + const backfill = await loadAppearanceBackfill(); + + expect(backfill.counts).toEqual({ + already_reviewed_variants: 9, + duplicate_variants: 5, + excluded_hits: 2, + raw_hits: 47, + }); + expect(backfill.candidates).toHaveLength(31); + expect(backfill.candidates.every(({ review_status: status }) => + status === "source-review-needed")).toBe(true); + expect(backfill.candidates[0]?.published_at).toBe("2026-05-21"); + expect(backfill.candidates.at(-1)?.published_at).toBe("2013-08-13"); + }); + + test("rejects incomplete hit accounting", async () => { + const value = parse(await readFile(join( + process.cwd(), + "public", + "research", + "appearance-backfill.yml", + ), "utf8")) as Record; + const counts = value.counts as Record; + counts.raw_hits = 48; + + expect(() => AppearanceBackfillFileSchema.parse(value)).toThrow( + "Backfill accounting covers 47 of 48 raw hits", + ); + }); +}); diff --git a/lib/appearance-backfill.ts b/lib/appearance-backfill.ts new file mode 100644 index 0000000..55e3ccd --- /dev/null +++ b/lib/appearance-backfill.ts @@ -0,0 +1,115 @@ +import { readFile } from "node:fs/promises"; +import { dirname, join } from "node:path"; +import { fileURLToPath } from "node:url"; + +import { parse } from "yaml"; +import { z } from "zod"; + +import { CompactTextSchema, HttpsUrlSchema, PartialDateSchema } from "./history-schema"; + +export const STRIPE_HISTORY_APPEARANCE_BACKFILL_SCHEMA_VERSION = + "stripe-history/appearance-backfill/v1" as const; + +const ExactDateSchema = PartialDateSchema.refine( + (value) => value.length === 10, + "Backfill dates must include year, month, and day", +); + +const AppearanceBackfillCandidateSchema = z.strictObject({ + participants: z.array(CompactTextSchema.max(100)).min(1).max(2), + published_at: ExactDateSchema, + review_status: z.literal("source-review-needed"), + title: CompactTextSchema.max(240), + url: HttpsUrlSchema, +}); + +export const AppearanceBackfillFileSchema = z.strictObject({ + candidates: z.array(AppearanceBackfillCandidateSchema).min(1).max(100), + completed_at: z.iso.datetime({ offset: true }), + counts: z.strictObject({ + already_reviewed_variants: z.number().int().nonnegative(), + duplicate_variants: z.number().int().nonnegative(), + excluded_hits: z.number().int().nonnegative(), + raw_hits: z.number().int().positive(), + }), + monitor_id: z.literal("exa-stripe-leadership-appearances"), + review_window: z.strictObject({ + from: ExactDateSchema, + through: ExactDateSchema, + }), + schema: z.literal(STRIPE_HISTORY_APPEARANCE_BACKFILL_SCHEMA_VERSION), + workflow_run: HttpsUrlSchema, +}).superRefine((file, context) => { + if (file.review_window.from > file.review_window.through) { + context.addIssue({ + code: "custom", + message: "Backfill review window must be ordered", + path: ["review_window"], + }); + } + const accountedHits = file.candidates.length + + file.counts.already_reviewed_variants + + file.counts.duplicate_variants + + file.counts.excluded_hits; + if (accountedHits !== file.counts.raw_hits) { + context.addIssue({ + code: "custom", + message: `Backfill accounting covers ${accountedHits} of ${file.counts.raw_hits} raw hits`, + path: ["counts"], + }); + } + const urls = new Set(); + for (const [index, candidate] of file.candidates.entries()) { + if ( + candidate.published_at < file.review_window.from + || candidate.published_at > file.review_window.through + ) { + context.addIssue({ + code: "custom", + message: "Candidate date falls outside the reviewed window", + path: ["candidates", index, "published_at"], + }); + } + if (urls.has(candidate.url)) { + context.addIssue({ + code: "custom", + message: "Candidate URLs must be unique", + path: ["candidates", index, "url"], + }); + } + urls.add(candidate.url); + const previous = file.candidates[index - 1]; + if ( + previous !== undefined + && ( + previous.published_at < candidate.published_at + || ( + previous.published_at === candidate.published_at + && previous.title.localeCompare(candidate.title) > 0 + ) + ) + ) { + context.addIssue({ + code: "custom", + message: "Candidates must be reverse chronological, then title ordered", + path: ["candidates", index], + }); + } + } +}); + +export type AppearanceBackfill = z.infer; + +const PROJECT_DIRECTORY = dirname(dirname(fileURLToPath(import.meta.url))); +const DEFAULT_PATH = join( + PROJECT_DIRECTORY, + "public", + "research", + "appearance-backfill.yml", +); + +export async function loadAppearanceBackfill( + path = DEFAULT_PATH, +): Promise { + return AppearanceBackfillFileSchema.parse(parse(await readFile(path, "utf8")) as unknown); +} diff --git a/public/research/appearance-backfill.yml b/public/research/appearance-backfill.yml new file mode 100644 index 0000000..34eee75 --- /dev/null +++ b/public/research/appearance-backfill.yml @@ -0,0 +1,168 @@ +schema: stripe-history/appearance-backfill/v1 +completed_at: 2026-08-19T14:45:15Z +workflow_run: https://github.com/hraness/stripe-history/actions/runs/32265726670 +monitor_id: exa-stripe-leadership-appearances +review_window: + from: 2009-01-01 + through: 2026-08-19 +counts: + raw_hits: 47 + already_reviewed_variants: 9 + duplicate_variants: 5 + excluded_hits: 2 +candidates: + - published_at: 2026-05-21 + title: "The Best Time in History to Start a Company | Patrick Collison & Amjad Masad" + url: https://www.youtube.com/watch?v=YgYiF86h0yU + participants: [Patrick Collison] + review_status: source-review-needed + - published_at: 2026-05-19 + title: "Nat Friedman and Daniel Gross in conversation with John and Patrick Collison" + url: https://www.youtube.com/watch?v=l9wzs_QIyp0 + participants: [John Collison, Patrick Collison] + review_status: source-review-needed + - published_at: 2026-05-16 + title: "Stripe's John Collison on How Agentic Commerce Will Reshape the Internet | Odd Lots" + url: https://www.youtube.com/watch?v=QhGqLqCzFac + participants: [John Collison] + review_status: source-review-needed + - published_at: 2026-04-28 + title: "John and Patrick Collison on Stripe's Growth, Agent Commerce, and the Future of Software" + url: https://a16z.com/podcast/john-and-patrick-collison-on-stripes-growth-agent-commerce-and-the-future-of-software + participants: [John Collison, Patrick Collison] + review_status: source-review-needed + - published_at: 2026-02-20 + title: "Patrick Collison on Stripe's Early Choices, Smalltalk, and What Comes After Coding" + url: https://a16z.com/podcast/patrick-collison-on-stripes-early-choices-smalltalk-and-what-comes-after-coding + participants: [Patrick Collison] + review_status: source-review-needed + - published_at: 2025-11-13 + title: "Inside Stripe: Stablecoins, AI, and (not) Going Public | Will Gaybrick" + url: https://www.youtube.com/watch?v=AM1_NADNSgI + participants: [Will Gaybrick] + review_status: source-review-needed + - published_at: 2025-07-17 + title: "Patrick Collison on programming languages, AI, and Stripe" + url: https://podcasts.apple.com/id/podcast/patrick-collison-on-programming-languages-ai-and/id1819406817?i=1000717598878 + participants: [Patrick Collison] + review_status: source-review-needed + - published_at: 2025-06-27 + title: "Hard Fork Live, with Patrick Collison, Kathryn Zealand, Sam Altman & Brad Lightcap" + url: https://www.youtube.com/watch?v=jdNwzYMtPN8 + participants: [Patrick Collison] + review_status: source-review-needed + - published_at: 2025-02-28 + title: "Bonus Episode: Stripe CEO John Collison" + url: https://podcasts.apple.com/us/podcast/bonus-episode-stripe-ceo-john-collison-2-28-25/id1480890290?i=1000696834852 + participants: [John Collison] + review_status: source-review-needed + - published_at: 2024-09-20 + title: "Will Gaybrick on capital allocation, org design, AI, and global growth" + url: https://podcasts.apple.com/us/podcast/ep-118-will-gaybrick-president-of-product-and/id1606770839?i=1000670156025 + participants: [Will Gaybrick] + review_status: source-review-needed + - published_at: 2023-10-06 + title: "Arthur Mensch and John Collison | Stripe AI Day Paris" + url: https://www.youtube.com/watch?v=yXN5xSXJ1Is + participants: [John Collison] + review_status: source-review-needed + - published_at: 2023-08-08 + title: "Scaling People with Claire Hughes Johnson" + url: https://www.newcomer.co/p/scaling-people-with-claire-hughes + participants: [Claire Hughes Johnson] + review_status: source-review-needed + - published_at: 2023-05-24 + title: "Claire Hughes Johnson on scaling operations and culture at Stripe" + url: https://podcasts.apple.com/us/podcast/claire-hughes-johnson-stripe-scaling-operations-and/id80867514?i=1000614322138 + participants: [Claire Hughes Johnson] + review_status: source-review-needed + - published_at: 2023-05-15 + title: "Stripe CEO Patrick Collison on innovating e-commerce and accelerating biomedical research" + url: https://podcasts.apple.com/us/podcast/stripe-ceo-patrick-collison-on-innovating-e-commerce/id1610419911?i=1000613083611 + participants: [Patrick Collison] + review_status: source-review-needed + - published_at: 2023-05-04 + title: "Building a culture of excellence | David Singleton" + url: https://www.youtube.com/watch?v=F0_IKKY3HCk + participants: [David Singleton] + review_status: source-review-needed + - published_at: 2023-03-06 + title: "Former Stripe COO Claire Hughes Johnson on scaling people" + url: https://podcasts.apple.com/us/podcast/128-former-coo-corporate-officer-at-stripe-claire-hughes/id1510985491?i=1000602919224 + participants: [Claire Hughes Johnson] + review_status: source-review-needed + - published_at: 2023-03-05 + title: "Lessons from scaling Stripe | Claire Hughes Johnson" + url: https://podcasts.apple.com/us/podcast/lessons-from-scaling-stripe-claire-hughes-johnson-ex/id1627920305?i=1000602823726 + participants: [Claire Hughes Johnson] + review_status: source-review-needed + - published_at: 2023-02-22 + title: "Extreme Product Design with Stripe CTO David Singleton" + url: https://podcasts.apple.com/us/podcast/saastr-636-extreme-product-design-building-things-people/id1089973241?i=1000601129097 + participants: [David Singleton] + review_status: source-review-needed + - published_at: 2023-02-14 + title: "Stripe's Patrick Collison: Micro Pessimism, Macro Optimism" + url: https://podcasts.apple.com/mu/podcast/stripes-patrick-collison-micro-pessimism-macro-optimism/id1089013200?i=1000599602701 + participants: [Patrick Collison] + review_status: source-review-needed + - published_at: 2022-07-13 + title: "Stripe's David Singleton on technology innovation, customers, and the CTO role" + url: https://podcasts.apple.com/us/podcast/stripes-david-singleton-on-technology-innovation-putting/id962121995?i=1000569774533 + participants: [David Singleton] + review_status: source-review-needed + - published_at: 2022-06-20 + title: "The future of the internet economy with John Collison" + url: https://podcasts.apple.com/ca/podcast/the-future-of-the-internet-economy-with-stripe/id1462649946?i=1000567104995 + participants: [John Collison] + review_status: source-review-needed + - published_at: 2022-06-10 + title: "John Collison in conversation with Stanley Druckenmiller | Sohn 2022" + url: https://www.youtube.com/watch?v=-7sWLIybWnQ + participants: [John Collison] + review_status: source-review-needed + - published_at: 2021-10-11 + title: "Stripe CRO Mike Clayville: Building Tornado Companies" + url: https://podcasts.apple.com/us/podcast/cro-stripe-mike-clayville-building-tornado-companies/id1510985491?i=1000538185612 + participants: [Mike Clayville] + review_status: source-review-needed + - published_at: 2021-05-10 + title: "Claire Hughes Johnson, COO of Stripe | The #ANGELS Podcast" + url: https://podcasts.apple.com/us/podcast/claire-hughes-johnson-coo-of-stripe/id1550832941?i=1000521087003 + participants: [Claire Hughes Johnson] + review_status: source-review-needed + - published_at: 2019-11-25 + title: "Tech and Progress with Patrick Collison and Tyler Cowen" + url: https://podcasts.apple.com/us/podcast/tech-and-progress-with-patrick-collison-and-tyler-cowen/id1460731098?i=1000457824338 + participants: [Patrick Collison] + review_status: source-review-needed + - published_at: 2018-05-02 + title: "Patrick Collison: Earning Your Stripes | The Knowledge Project" + url: https://podcasts.apple.com/us/podcast/32-patrick-collison-earning-your-stripes/id990149481?i=1000410487693 + participants: [Patrick Collison] + review_status: source-review-needed + - published_at: 2018-03-02 + title: "Stripe's Patrick Collison: I'm petrified of getting too big" + url: https://podcasts.apple.com/us/podcast/stripes-patrick-collison-im-petrified-of-getting-too/id1233991021?i=1000404469689 + participants: [Patrick Collison] + review_status: source-review-needed + - published_at: 2017-04-12 + title: "Patrick Collison has a few questions for Tyler (live)" + url: https://podcasts.apple.com/jp/podcast/patrick-collison-has-a-few-questions-for-tyler-live/id983795625?i=1000384289632 + participants: [Patrick Collison] + review_status: source-review-needed + - published_at: 2016-12-06 + title: "Stripe CEO Patrick Collison on management, rationalism, and the Enlightenment" + url: https://podcasts.apple.com/no/podcast/stripe-ceo-patrick-collison-on-management-rationalism/id1081584611?i=1000378637097 + participants: [Patrick Collison] + review_status: source-review-needed + - published_at: 2014-10-28 + title: "Hiring and Culture, Part 2 | Patrick and John Collison" + url: https://www.youtube.com/watch?v=H8Dl8rZ6qwE + participants: [Patrick Collison, John Collison] + review_status: source-review-needed + - published_at: 2013-08-13 + title: "unSEXY Conf 2013: Patrick Collison, Stripe" + url: https://www.youtube.com/watch?v=y_4emS6D4og + participants: [Patrick Collison] + review_status: source-review-needed