From 412bf1c4d201bc287a5446fc7f38c4131046b6b1 Mon Sep 17 00:00:00 2001 From: Lukas Bresser <82394590+lksbrssr@users.noreply.github.com> Date: Tue, 4 Aug 2026 09:27:12 -0600 Subject: [PATCH 1/2] Take /impact public route down to preview-only #98 shipped /impact as a public, in-nav route alongside the intended cryptic noindex preview. Remove the public route and its nav link so only the unlisted preview (/impact-preview-eb61fba1b98e/) remains. --- src/app/impact/page.tsx | 144 ---------------------------------------- src/lib/site-config.ts | 1 - 2 files changed, 145 deletions(-) delete mode 100644 src/app/impact/page.tsx diff --git a/src/app/impact/page.tsx b/src/app/impact/page.tsx deleted file mode 100644 index 82f401a2..00000000 --- a/src/app/impact/page.tsx +++ /dev/null @@ -1,144 +0,0 @@ -import type { Metadata } from 'next' -import Breadcrumb from '@/components/Breadcrumb' -import ImpactDashboardV2, { type LiveMetric, type LiveOutputs } from '@/components/ImpactDashboardV2' -import MeasuringQuestionsV2 from '@/components/MeasuringQuestionsV2' -import { fetchSimocracyStats } from '@/lib/simocracy' -import { fetchGainforestStats } from '@/lib/gainforest' -import { fetchGlowStats } from '@/lib/glow' -import { resolveAllSignals } from '@/lib/market-signals' -import { FOCUS_AREAS, type FocusAreaKey } from '@/lib/inflection-points' -import { instrumentsForArea, withOpenAlex, type InstrumentRecord } from '@/lib/velocity-instruments' -import { loadAllOpenAlex } from '@/lib/velocity-openalex' - -// The impact page reads field velocity: the interventions we run, the five -// instruments we read a field's rate of change with, and the inflection points -// we track, each with its live signal. -export const revalidate = 60 - -async function fetchLiveOutputs(): Promise { - const compact = (n: number) => - new Intl.NumberFormat('en-US', { notation: 'compact', maximumFractionDigits: 1 }).format(n) - const out: LiveOutputs = {} - - const [sim, gf, glow] = await Promise.allSettled([ - fetchSimocracyStats(), - fetchGainforestStats(), - fetchGlowStats(), - ]) - - // A binding decision at scale — Simocracy (a PL-supported deliberation mechanism). - if (sim.status === 'fulfilled' && !sim.value.degraded) { - const t = sim.value.totals - const metrics: LiveMetric[] = [ - { n: t.uniqueHumans, label: 'participants' }, - { n: t.totalSims, label: 'simulations' }, - { n: t.totalGatherings, label: 'gatherings' }, - ] - .filter((m) => m.n > 0) - .map((m) => ({ value: compact(m.n), label: m.label })) - if (metrics.length) out['A binding decision at scale'] = metrics - } - - // Capital that pays on verified outcomes — GainForest + Glow (PL-backed MRV teams). - const verified: LiveMetric[] = [] - if (gf.status === 'fulfilled' && !gf.value.degraded) { - const g = gf.value - if (g.observations > 0) verified.push({ value: compact(g.observations), label: 'species observations' }) - if (g.certifiedOrgs > 0) verified.push({ value: compact(g.certifiedOrgs), label: 'certified orgs' }) - } - if (glow.status === 'fulfilled' && !glow.value.degraded) { - const gl = glow.value - if (gl.activeFarms > 0) verified.push({ value: compact(gl.activeFarms), label: 'active solar farms' }) - if (gl.carbon > 0) verified.push({ value: compact(gl.carbon), label: 'tCO₂ / wk' }) - } - if (verified.length) out['Capital that pays on verified outcomes'] = verified - - return out -} - -export const metadata: Metadata = { - title: 'Impact', - description: - 'How we judge PL R&D: whether the fields we back are speeding up. We name the interventions we run, then read field velocity through five instruments and the inflection points we track.', -} - -export default async function ImpactPage() { - const [liveOutputs, marketSignals] = await Promise.all([fetchLiveOutputs(), resolveAllSignals()]) - - // Merge any OpenAlex CSV readings (idea vintage + talent entry) into the static - // instrument records, per focus area. Parsed at build time; absent CSVs are a - // no-op, leaving the documented `unwired` records in place. - const openAlex = loadAllOpenAlex() - const recordsByArea = Object.fromEntries( - FOCUS_AREAS.map((fa) => [fa.key, withOpenAlex(instrumentsForArea(fa.key), openAlex[fa.key])]), - ) as Partial> - - // Example idea-vintage series per field, for the methodology modal that explains - // the instrument (shown as small multiples). - const ideaVintageExamples = FOCUS_AREAS.map((fa) => { - const rec = (recordsByArea[fa.key] ?? []).find( - (r) => r.instrument === 'idea_vintage' && r.state === 'reading' && r.series && r.series.length > 1, - ) - return rec ? { label: fa.label, series: rec.series!, scale: rec.seriesScale ?? 'linear' } : null - }).filter((x): x is { label: string; series: NonNullable; scale: 'linear' | 'log' } => !!x) - return ( -
- {/* Hero */} -
- -
-

- PL R&D’s impact on field velocity -

-

- We back fields we think are ready to move, then check whether they do.{' '} - Field velocity is that rate of change: - how fast talent enters, capital forms, tool costs fall, and output ships.{' '} - Inflection points are one of the markers - we read — dated, falsifiable shifts an accelerating field should produce. -

-

- We measure velocity the same way we do the work: as a research program. Whether field - acceleration works is itself the open question, tested across all four focus areas. -

- - Learn more about our methodology - - - - -
-
- - {/* Field velocity — grey full-bleed section to set it apart from the rest of the site */} -
-
-

Field velocity

-

- Pick a focus area. The summary above reads that field’s velocity across the instruments - that apply to it; the inflection points below are the specific markers we track, each with its - live signal. -

- -
-
- - {/* Methodology */} -
-

Our methodology

-

- The method is the meta-research design of how we do field acceleration. We name the - interventions we run, then read field velocity as the result. Same design, every focus area. -

- -
-
- ) -} diff --git a/src/lib/site-config.ts b/src/lib/site-config.ts index 70e11ae0..1078cd16 100644 --- a/src/lib/site-config.ts +++ b/src/lib/site-config.ts @@ -35,7 +35,6 @@ export const mainNav: NavItem[] = [ { name: 'Neurotech', url: '/areas/neurotech/' }, ], }, - { name: 'Impact', url: '/impact/' }, { name: 'Insights', url: '/insights/' }, { name: 'Team', url: '/authors/' }, ] From 5ebb50ea0c0ff77db315473e87f3c5b00d66e770 Mon Sep 17 00:00:00 2001 From: Lukas Bresser <82394590+lksbrssr@users.noreply.github.com> Date: Tue, 4 Aug 2026 09:29:37 -0600 Subject: [PATCH 2/2] Go live: restore public /impact route + nav link Merge this when we're ready to promote the Impact dashboard from the unlisted preview to a public, in-nav page. Reverses the takedown in #104. --- src/app/impact/page.tsx | 144 ++++++++++++++++++++++++++++++++++++++++ src/lib/site-config.ts | 1 + 2 files changed, 145 insertions(+) create mode 100644 src/app/impact/page.tsx diff --git a/src/app/impact/page.tsx b/src/app/impact/page.tsx new file mode 100644 index 00000000..82f401a2 --- /dev/null +++ b/src/app/impact/page.tsx @@ -0,0 +1,144 @@ +import type { Metadata } from 'next' +import Breadcrumb from '@/components/Breadcrumb' +import ImpactDashboardV2, { type LiveMetric, type LiveOutputs } from '@/components/ImpactDashboardV2' +import MeasuringQuestionsV2 from '@/components/MeasuringQuestionsV2' +import { fetchSimocracyStats } from '@/lib/simocracy' +import { fetchGainforestStats } from '@/lib/gainforest' +import { fetchGlowStats } from '@/lib/glow' +import { resolveAllSignals } from '@/lib/market-signals' +import { FOCUS_AREAS, type FocusAreaKey } from '@/lib/inflection-points' +import { instrumentsForArea, withOpenAlex, type InstrumentRecord } from '@/lib/velocity-instruments' +import { loadAllOpenAlex } from '@/lib/velocity-openalex' + +// The impact page reads field velocity: the interventions we run, the five +// instruments we read a field's rate of change with, and the inflection points +// we track, each with its live signal. +export const revalidate = 60 + +async function fetchLiveOutputs(): Promise { + const compact = (n: number) => + new Intl.NumberFormat('en-US', { notation: 'compact', maximumFractionDigits: 1 }).format(n) + const out: LiveOutputs = {} + + const [sim, gf, glow] = await Promise.allSettled([ + fetchSimocracyStats(), + fetchGainforestStats(), + fetchGlowStats(), + ]) + + // A binding decision at scale — Simocracy (a PL-supported deliberation mechanism). + if (sim.status === 'fulfilled' && !sim.value.degraded) { + const t = sim.value.totals + const metrics: LiveMetric[] = [ + { n: t.uniqueHumans, label: 'participants' }, + { n: t.totalSims, label: 'simulations' }, + { n: t.totalGatherings, label: 'gatherings' }, + ] + .filter((m) => m.n > 0) + .map((m) => ({ value: compact(m.n), label: m.label })) + if (metrics.length) out['A binding decision at scale'] = metrics + } + + // Capital that pays on verified outcomes — GainForest + Glow (PL-backed MRV teams). + const verified: LiveMetric[] = [] + if (gf.status === 'fulfilled' && !gf.value.degraded) { + const g = gf.value + if (g.observations > 0) verified.push({ value: compact(g.observations), label: 'species observations' }) + if (g.certifiedOrgs > 0) verified.push({ value: compact(g.certifiedOrgs), label: 'certified orgs' }) + } + if (glow.status === 'fulfilled' && !glow.value.degraded) { + const gl = glow.value + if (gl.activeFarms > 0) verified.push({ value: compact(gl.activeFarms), label: 'active solar farms' }) + if (gl.carbon > 0) verified.push({ value: compact(gl.carbon), label: 'tCO₂ / wk' }) + } + if (verified.length) out['Capital that pays on verified outcomes'] = verified + + return out +} + +export const metadata: Metadata = { + title: 'Impact', + description: + 'How we judge PL R&D: whether the fields we back are speeding up. We name the interventions we run, then read field velocity through five instruments and the inflection points we track.', +} + +export default async function ImpactPage() { + const [liveOutputs, marketSignals] = await Promise.all([fetchLiveOutputs(), resolveAllSignals()]) + + // Merge any OpenAlex CSV readings (idea vintage + talent entry) into the static + // instrument records, per focus area. Parsed at build time; absent CSVs are a + // no-op, leaving the documented `unwired` records in place. + const openAlex = loadAllOpenAlex() + const recordsByArea = Object.fromEntries( + FOCUS_AREAS.map((fa) => [fa.key, withOpenAlex(instrumentsForArea(fa.key), openAlex[fa.key])]), + ) as Partial> + + // Example idea-vintage series per field, for the methodology modal that explains + // the instrument (shown as small multiples). + const ideaVintageExamples = FOCUS_AREAS.map((fa) => { + const rec = (recordsByArea[fa.key] ?? []).find( + (r) => r.instrument === 'idea_vintage' && r.state === 'reading' && r.series && r.series.length > 1, + ) + return rec ? { label: fa.label, series: rec.series!, scale: rec.seriesScale ?? 'linear' } : null + }).filter((x): x is { label: string; series: NonNullable; scale: 'linear' | 'log' } => !!x) + return ( +
+ {/* Hero */} +
+ +
+

+ PL R&D’s impact on field velocity +

+

+ We back fields we think are ready to move, then check whether they do.{' '} + Field velocity is that rate of change: + how fast talent enters, capital forms, tool costs fall, and output ships.{' '} + Inflection points are one of the markers + we read — dated, falsifiable shifts an accelerating field should produce. +

+

+ We measure velocity the same way we do the work: as a research program. Whether field + acceleration works is itself the open question, tested across all four focus areas. +

+ + Learn more about our methodology + + + + +
+
+ + {/* Field velocity — grey full-bleed section to set it apart from the rest of the site */} +
+
+

Field velocity

+

+ Pick a focus area. The summary above reads that field’s velocity across the instruments + that apply to it; the inflection points below are the specific markers we track, each with its + live signal. +

+ +
+
+ + {/* Methodology */} +
+

Our methodology

+

+ The method is the meta-research design of how we do field acceleration. We name the + interventions we run, then read field velocity as the result. Same design, every focus area. +

+ +
+
+ ) +} diff --git a/src/lib/site-config.ts b/src/lib/site-config.ts index 1078cd16..70e11ae0 100644 --- a/src/lib/site-config.ts +++ b/src/lib/site-config.ts @@ -35,6 +35,7 @@ export const mainNav: NavItem[] = [ { name: 'Neurotech', url: '/areas/neurotech/' }, ], }, + { name: 'Impact', url: '/impact/' }, { name: 'Insights', url: '/insights/' }, { name: 'Team', url: '/authors/' }, ]