diff --git a/docs/screenshots/impact-methodology-attribution-dark.png b/docs/screenshots/impact-methodology-attribution-dark.png new file mode 100644 index 00000000..7381e551 Binary files /dev/null and b/docs/screenshots/impact-methodology-attribution-dark.png differ diff --git a/docs/screenshots/impact-methodology-attribution-light.png b/docs/screenshots/impact-methodology-attribution-light.png new file mode 100644 index 00000000..837d27ad Binary files /dev/null and b/docs/screenshots/impact-methodology-attribution-light.png differ diff --git a/docs/screenshots/impact-preview-ribbon.png b/docs/screenshots/impact-preview-ribbon.png new file mode 100644 index 00000000..0c142932 Binary files /dev/null and b/docs/screenshots/impact-preview-ribbon.png differ diff --git a/public/robots.txt b/public/robots.txt index ad3cf8e4..7592a93b 100644 --- a/public/robots.txt +++ b/public/robots.txt @@ -5,5 +5,8 @@ Disallow: /admin Disallow: /edit Disallow: /write Disallow: /api/ +# Unlisted drafts — shared by link only, not for indexing. +Disallow: /impact +Disallow: /impact-preview Sitemap: https://www.plrd.org/sitemap.xml diff --git a/src/app/globals.css b/src/app/globals.css index a0e74b33..185d7543 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -100,7 +100,6 @@ body { :root { --impact-field: #131316; /* the field axis (neutral ink) */ --impact-field-ink: #ffffff; /* text on a field-accent fill */ - --impact-field-track: #e5e7eb; /* empty progress segment */ --impact-hand: #1982f4; /* our-hand axis (blue) */ } @@ -134,7 +133,6 @@ html.dark { to light so white badge text is swapped for dark ink. */ --impact-field: #e9e9ee; --impact-field-ink: #15171c; - --impact-field-track: #3a3f4b; --impact-hand: #3b96f6; } diff --git a/src/app/impact-preview/[key]/page.tsx b/src/app/impact-preview/[key]/page.tsx new file mode 100644 index 00000000..4d8f913f --- /dev/null +++ b/src/app/impact-preview/[key]/page.tsx @@ -0,0 +1,36 @@ +import type { Metadata } from 'next' +import { notFound } from 'next/navigation' +import ImpactExperience from '@/components/ImpactExperience' + +// ── Hidden preview of the Impact experience ─────────────────────────────────── +// Shared only by link. The path segment IS the secret: `dynamicParams = false` +// plus a single `generateStaticParams` entry means every URL except the exact +// key 404s. The page is marked noindex/nofollow, is not in the nav, and is not +// in the sitemap. Rotate the key below to invalidate an old link. +const PREVIEW_KEY = '024dbf9194f85c80c584f572d22d5aa7' + +export const revalidate = 60 +export const dynamicParams = false + +export function generateStaticParams() { + return [{ key: PREVIEW_KEY }] +} + +export const metadata: Metadata = { + title: 'Impact (preview)', + robots: { + index: false, + follow: false, + googleBot: { index: false, follow: false }, + }, +} + +export default async function ImpactPreviewPage({ + params, +}: { + params: Promise<{ key: string }> +}) { + const { key } = await params + if (key !== PREVIEW_KEY) notFound() + return +} diff --git a/src/app/impact/page.tsx b/src/app/impact/page.tsx index 82f401a2..6e9707ab 100644 --- a/src/app/impact/page.tsx +++ b/src/app/impact/page.tsx @@ -1,144 +1,27 @@ 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' +import ImpactExperience from '@/components/ImpactExperience' // 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. +// +// NOTE: this is an unlisted draft. It is not in the nav and not in the sitemap, +// and it is marked noindex/nofollow so search engines skip it. The shareable +// entry point is the cryptic /impact-preview// route; this canonical path +// is kept working but deliberately undiscoverable until the work is signed off. 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.', + robots: { + index: false, + follow: false, + googleBot: { index: false, follow: false }, + }, } 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. -

- -
-
- ) + return } diff --git a/src/components/ImpactDashboardV2.tsx b/src/components/ImpactDashboardV2.tsx index 0b1ec9af..775295e1 100644 --- a/src/components/ImpactDashboardV2.tsx +++ b/src/components/ImpactDashboardV2.tsx @@ -10,10 +10,8 @@ import { useEffect, useMemo, useState } from 'react' import { ROLE_META, PL_ROLE_ORDER, - FIELD_STAGES, HOW_TO_READ, TEAM_LINKS, - stageIndexForStatus, resolutionFor, inflectionLabel, isConcerningMarker, @@ -25,7 +23,6 @@ import { INFLECTION_POINTS, FIELD_COLOR, FIELD_INK, - FIELD_TRACK, HAND_COLOR, LIVE_COLOR, type FocusAreaKey, @@ -251,6 +248,11 @@ function shortDate(s?: string): string | undefined { return s ? s.slice(0, 10) : s } +/** Review status line. Reads "not yet reviewed" until a review date lands. */ +function reviewedLabel(asOf?: string): string { + return asOf ? `reviewed ${asOf}` : 'not yet reviewed' +} + function marketReadout(s: MarketSignal): string { return s.readout ?? (s.prob != null ? `${Math.round(s.prob * 100)}%` : '—') } @@ -665,30 +667,6 @@ function MissesLedger({ points }: { points: InflectionPoint[] }) { ) } -function FieldMeter({ status }: { status: InflectionPoint['status'] }) { - const reached = stageIndexForStatus(status) - return ( -
-
- {FIELD_STAGES.map((_, i) => ( - - ))} -
-
- {FIELD_STAGES.map((s, i) => ( - - {s} - - ))} -
-
- ) -} - function RoleChips({ roles }: { roles: PLRole[] }) { const ordered = PL_ROLE_ORDER.filter((r) => roles.includes(r)) return ( @@ -729,7 +707,6 @@ function InflectionCard({ onOpen: () => void }) { const fa = FOCUS_AREAS.find((f) => f.key === point.area)! - const stageLabel = FIELD_STAGES[stageIndexForStatus(point.status)] const hasLiveSignal = !!( point.liveEvidence?.length || (metrics && metrics.length) || @@ -767,21 +744,12 @@ function InflectionCard({
- reviewed {resolution.asOf ?? 'not yet'} + {reviewedLabel(resolution.asOf)}
-
- - The field - - {stageLabel} -
-
- -
Our hand @@ -917,18 +885,11 @@ function InflectionModal({

{point.cascade}

-
-
- Progress against inflection point -
- -
- {/* Resolution: outcome × mattered (never inferred from one another). */} -
+
- reviewed {resolutionFor(point).asOf ?? 'not yet'} + {reviewedLabel(resolutionFor(point).asOf)}
{resolutionFor(point).matteredEvidence && ( diff --git a/src/components/ImpactExperience.tsx b/src/components/ImpactExperience.tsx new file mode 100644 index 00000000..49eb6c5d --- /dev/null +++ b/src/components/ImpactExperience.tsx @@ -0,0 +1,151 @@ +// Shared body of the Impact experience (hero → field-velocity dashboard → +// methodology). Rendered by both the canonical /impact route and the hidden, +// un-indexed preview route, so the two never drift. All data fetching lives +// here; the route files stay thin (metadata + gating only). + +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' + +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 +} + +/** + * The full impact experience. `preview` shows a small ribbon so anyone with the + * secret link knows they are looking at an unlisted draft. + */ +export default async function ImpactExperience({ preview = false }: { preview?: boolean } = {}) { + 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 ( +
+ {preview && ( +
+
+ Unlisted preview. A private draft shared by link — + not linked from the site, not indexed, and still under review. Please don’t share the URL. +
+
+ )} + + {/* 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/components/MeasuringQuestionsV2.tsx b/src/components/MeasuringQuestionsV2.tsx index 1fdaff86..395b0d18 100644 --- a/src/components/MeasuringQuestionsV2.tsx +++ b/src/components/MeasuringQuestionsV2.tsx @@ -114,6 +114,48 @@ export default function MeasuringQuestionsV2({
+ {/* Downward divider — the field is observed, our contribution to it is graded. */} +
+
+ + + + + +
+ + {/* Block 3 — attribution, held honestly for now */} +
+
+
+
+ Our hand +
+

How we think about attribution

+

+ We watch whether the fields we back speed up. We do not claim our interventions are what + made them. +

+
+ +
+

+ We don’t claim our interventions directly cause these fields to accelerate. Field-level + attribution isn’t cleanly identifiable: four fields, no counterfactual, effects that lag + years, and interventions small next to the forces already moving a frontier. For now we hold + that gap honestly — we name the interventions we run and read whether the field moves, + without drawing a causal line between the two. +

+

+ Making that loop clearer is work we intend to do: tracing specific interventions to specific + outcomes, being honest about how strong each link is, and asking the people on the receiving + end what they would have done otherwise, including where they’d have gotten there without + us. When that evidence is solid enough to stand on, we plan to publish it here. +

+
+
+
+ {modal && ( setModal(null)} /> )} diff --git a/src/lib/field-velocity.ts b/src/lib/field-velocity.ts index e217fcf5..f296177f 100644 --- a/src/lib/field-velocity.ts +++ b/src/lib/field-velocity.ts @@ -21,7 +21,6 @@ import { FOCUS_AREAS, FIELD_COLOR, FIELD_INK, - FIELD_TRACK, HAND_COLOR, LIVE_COLOR, type FocusAreaKey, @@ -30,7 +29,7 @@ import { // Re-export the shared color + two-axis primitives so components import from one // place and the theme-aware dark-mode handling is reused verbatim. -export { FIELD_COLOR, FIELD_INK, FIELD_TRACK, HAND_COLOR, LIVE_COLOR } +export { FIELD_COLOR, FIELD_INK, HAND_COLOR, LIVE_COLOR } export { FOCUS_AREAS, INFLECTION_POINTS } export type { FocusAreaKey, InflectionPoint } diff --git a/src/lib/inflection-points.ts b/src/lib/inflection-points.ts index 8929df9f..18c39bf6 100644 --- a/src/lib/inflection-points.ts +++ b/src/lib/inflection-points.ts @@ -18,8 +18,6 @@ // // Source: "Inflection points across PL R&D, and how we will measure them." -export type InflectionStatus = 'watching' | 'early-signal' | 'tripped' - /** PL's pre-registered role(s) on the critical path — claims to be evidenced, not a credit score. */ export type PLRole = 'infrastructure' | 'legibility' | 'connection' | 'capital' | 'translation' | 'permission' @@ -35,8 +33,6 @@ export const FIELD_COLOR = 'var(--impact-field)' export const HAND_COLOR = 'var(--impact-hand)' /** Text/ink color to place on a FIELD_COLOR fill (white in light, dark in dark). */ export const FIELD_INK = 'var(--impact-field-ink)' -/** Empty segment color for the field-progress meter. */ -export const FIELD_TRACK = 'var(--impact-field-track)' /** Live-signal accent — the pulsing dot on points with live outputs (green). */ export const LIVE_COLOR = '#22c55e' @@ -89,8 +85,6 @@ export type InflectionPoint = { contribution: Contribution /** Q3, summarized as the PL role(s) on the critical path — the instruments we bring. */ roles: PLRole[] - /** Field-progress lifecycle state. All start 'watching' — none reached as of 2026. */ - status: InflectionStatus /** Optional live activity / real-world signals — strictly Q3 evidence, never Q2 progress. */ liveEvidence?: LiveEvidence[] @@ -150,40 +144,6 @@ export const LOGIC_MODEL = [ ] as const export type LogicStageKey = (typeof LOGIC_MODEL)[number]['key'] -// ── Field-progress lifecycle (Q1 & Q2). Deliberately separate from PL contribution. ── -export const FIELD_STAGES = ['Defined', 'Emerging', 'Reached', 'Scaling'] as const -export type FieldStage = (typeof FIELD_STAGES)[number] - -/** How far along the field axis a point sits, given its status. */ -export function stageIndexForStatus(status: InflectionStatus): number { - switch (status) { - case 'watching': - return 0 // threshold defined, waiting at it - case 'early-signal': - return 1 - case 'tripped': - return 2 - } -} - -export const STATUS_META: Record = { - watching: { - label: 'Defined', - description: 'The threshold is defined and pre-registered. No movement toward it yet.', - color: '#6b6d79', - }, - 'early-signal': { - label: 'Emerging', - description: 'Leading indicators are moving toward the threshold.', - color: '#1982F4', - }, - tripped: { - label: 'Reached', - description: 'The defined threshold has been crossed.', - color: '#12bfdf', - }, -} - /** * Team / venture display name -> canonical website. Used to linkify the named * examples that appear in contribution copy (activities / outputs) so each @@ -256,7 +216,6 @@ export const INFLECTION_POINTS: InflectionPoint[] = [ outputs: 'libp2p / IPFS deployments and the funded comms / messaging teams building on them, such as Fluence and Huddle01.', }, roles: ['infrastructure', 'capital'], - status: 'early-signal', liveEvidence: [ { label: 'Wikipedia kept online via IPFS during Turkey’s block', @@ -279,7 +238,6 @@ export const INFLECTION_POINTS: InflectionPoint[] = [ outputs: 'The identity and credential initiatives PL has seeded or funded, such as Tools for Humanity (World), SpruceID, and Privy.', }, roles: ['connection', 'capital'], - status: 'watching', }, { area: 'digital-human-rights', @@ -295,7 +253,6 @@ export const INFLECTION_POINTS: InflectionPoint[] = [ outputs: 'Content-addressed provenance tooling and the PL-backed teams building it, such as EQTY Lab.', }, roles: ['infrastructure', 'capital'], - status: 'early-signal', liveEvidence: [ { label: 'Starling Lab — content-authenticity displays in newsrooms', @@ -318,7 +275,6 @@ export const INFLECTION_POINTS: InflectionPoint[] = [ outputs: 'Filecoin and the open-compute portfolio — Fluence, Spheron, Expanso, Impossible Cloud, Lava, Fleek — with integrations across storage, compute, and identity.', }, roles: ['infrastructure', 'connection', 'capital'], - status: 'watching', }, // ── FA2 · Economies & Governance ───────────────────────────────────────── @@ -336,7 +292,6 @@ export const INFLECTION_POINTS: InflectionPoint[] = [ outputs: 'Published playbooks, convened sovereign–builder cohorts, and funded DPI primitives.', }, roles: ['connection', 'capital', 'permission'], - status: 'watching', }, { area: 'economies-governance', @@ -352,7 +307,6 @@ export const INFLECTION_POINTS: InflectionPoint[] = [ outputs: 'Simocracy and broad-listening tools, and the government–tool convenings around them.', }, roles: ['connection', 'capital'], - status: 'watching', liveEvidence: [ { label: 'Simocracy governance simulation — live participation', @@ -375,7 +329,6 @@ export const INFLECTION_POINTS: InflectionPoint[] = [ outputs: 'Hypercerts, Funding the Commons, and ventures spun out of / funded across this lineage such as Molecule.', }, roles: ['infrastructure', 'capital', 'translation'], - status: 'early-signal', }, { area: 'economies-governance', @@ -391,7 +344,6 @@ export const INFLECTION_POINTS: InflectionPoint[] = [ outputs: 'GainForest, Glow, WeatherXM, and the verification benchmarks and standards they inform.', }, roles: ['legibility', 'connection', 'capital'], - status: 'early-signal', liveEvidence: [ { label: 'GainForest & Glow — live verification activity', @@ -416,7 +368,6 @@ export const INFLECTION_POINTS: InflectionPoint[] = [ outputs: 'A draft BCI component / API standard and the regulator–maker–developer convenings around it.', }, roles: ['connection', 'permission'], - status: 'watching', }, { area: 'neurotech', @@ -432,7 +383,6 @@ export const INFLECTION_POINTS: InflectionPoint[] = [ outputs: 'The PL Neuro talent network and the neural-data infrastructure and norms it seeds.', }, roles: ['infrastructure', 'connection', 'capital'], - status: 'watching', }, { area: 'neurotech', @@ -448,7 +398,6 @@ export const INFLECTION_POINTS: InflectionPoint[] = [ outputs: 'PL-funded NeuroAI demos and the energy-efficiency benchmarks that frame the target.', }, roles: ['legibility', 'capital'], - status: 'watching', }, { area: 'neurotech', @@ -464,7 +413,6 @@ export const INFLECTION_POINTS: InflectionPoint[] = [ outputs: 'The WBE benchmark, connectomics throughput targets, and a PL-engineered demo.', }, roles: ['legibility', 'connection'], - status: 'watching', }, ] diff --git a/src/lib/site-config.ts b/src/lib/site-config.ts index 70e11ae0..f4ec9915 100644 --- a/src/lib/site-config.ts +++ b/src/lib/site-config.ts @@ -35,7 +35,8 @@ export const mainNav: NavItem[] = [ { name: 'Neurotech', url: '/areas/neurotech/' }, ], }, - { name: 'Impact', url: '/impact/' }, + // 'Impact' is intentionally omitted from the nav: the impact experience is an + // unlisted draft, reachable only via the cryptic /impact-preview// link. { name: 'Insights', url: '/insights/' }, { name: 'Team', url: '/authors/' }, ]