import type { Metadata } from 'next'; import Link from 'next/link'; import { ATTRIBUTION, DISCLAIMER, FIELD_PRIORITY } from '@/components/meta/legal'; import { FreshnessSection, LimitationsSection, MissionLaunchSection, OrbitCalcSection, OrbitClassSection, PipelineSection, ResolutionSection, StatusSection } from '@/components/meta/methodology-sections'; import { ConstellationRulesSection, MetricsSection, OwnerCodesSection } from '@/components/meta/methodology-tables'; import { Callout, DocLayout, DocSection, Prose } from '@/components/meta/prose'; import { Container, PageHeader } from '@/components/ui/section'; import { api, safe } from '@/lib/api'; import { fmtDateTime } from '@/lib/format'; import { SITE_URL, routes } from '@/lib/site'; export const metadata: Metadata = { title: 'Methodology — how SatelliteIndex builds and derives its data', description: 'Ingestion pipeline, source priorities, entity resolution, SGP4 orbit calculation, status and orbit-class rules, constellation membership, versioned derived metrics, freshness thresholds and known limitations.', alternates: { canonical: `${SITE_URL}/methodology` }, openGraph: { title: 'Methodology | SatelliteIndex', description: 'How every value on SatelliteIndex is sourced, resolved, computed and labelled.', url: `${SITE_URL}/methodology` }, twitter: { card: 'summary', title: 'Methodology | SatelliteIndex', description: 'How every value on SatelliteIndex is sourced, resolved, computed and labelled.' }, }; const TOC = [ { id: 'pipeline', label: 'Data pipeline' }, { id: 'source-priority', label: 'Source priorities' }, { id: 'entity-resolution', label: 'Entity resolution' }, { id: 'orbit-calculation', label: 'Orbit calculation' }, { id: 'status', label: 'Status classification' }, { id: 'orbit-class', label: 'Orbit class' }, { id: 'constellations', label: 'Constellation membership' }, { id: 'mission-type', label: 'Mission type' }, { id: 'launches', label: 'Launches' }, { id: 'owner-codes', label: 'Owner codes' }, { id: 'metrics', label: 'Derived metrics' }, { id: 'freshness', label: 'Freshness' }, { id: 'limitations', label: 'Limitations' }, { id: 'disclaimer', label: 'Disclaimer' }, ]; export default async function MethodologyPage() { const res = await safe(api.methodology()); const payload = res?.data ?? null; const metric = (key: string) => payload?.metrics.find((m) => m.key === key)?.methodology ?? null; return (

Sources and licenses: /sources · Live freshness: /status/data · Machine-readable: /api/v1/methodology {res && · definitions fetched {fmtDateTime(res.meta.generated_at)}}

Sources carry a numeric priority; when two sources describe the same field the higher-priority value is kept and the other is still recorded in provenance. In practice each field family has one primary source today:

{FIELD_PRIORITY.map((f) => ( ))}
Field Primary source Note
{f.field} {f.source} {f.note}
{DISCLAIMER}

{ATTRIBUTION}

See the terms of use. Corrections and questions: about.

); }