SPB Git forge

spb/cancerindex

Public
37commits 1branches 0releases
2.9 MBsize
maindefault branch
10 days agolast push
TypeScript 97.2% SQL 1.5% CSS 0.6% JavaScript 0.5%
3.8 KB · 49 lines tsx
Raw Blame History
1import type { Metadata } from 'next';2import Link from 'next/link';3import { PageHeader, Section } from '@/components/ui/section';4import { ClaimBadge } from '@/components/ui/badge';5import { CONTACT_EMAIL, DISCLAIMER } from '@/lib/site';67export const metadata: Metadata = { title: 'Trust & policies', description: 'Provenance, methodology, AI policy, privacy, security, source policy and corrections.' };89export default function TrustPage() {10  return (11    <div className="ci-prose max-w-3xl">12      <PageHeader kicker="Trust" title="Trust & policies" lede={DISCLAIMER} />13      <Section id="provenance" kicker="§2" title="Provenance">14        <p>Every imported fact carries a provenance row: source, dataset, version, retrieval date, evidence type, license and — where relevant — PMID or DOI. Raw payloads are archived unchanged. Hover any source badge to see the chain; administrators can trace any value to its raw record.</p>15      </Section>16      <Section id="methodology" kicker="§250" title="Methodology">17        <p>18          Derived values reference a versioned formula from the public <Link className="ci-link" href="/methodology">metric catalog</Link>. Snapshots store their inputs hash; identical inputs yield identical ranks.19        </p>20      </Section>21      <Section id="labels" kicker="§3" title="Scientific safety labels">22        <p className="flex flex-wrap items-center gap-1.5">23          <ClaimBadge kind="observed" /> <ClaimBadge kind="published" /> <ClaimBadge kind="curated" /> <ClaimBadge kind="regulatory" /> <ClaimBadge kind="guideline" /> <ClaimBadge kind="computed" /> <ClaimBadge kind="ai" />24        </p>25        <p className="mt-2">Labels are never merged. Regulatory status is always tied to a jurisdiction and an indication. Population survival is never presented as an individual prognosis.</p>26      </Section>27      <Section id="ai" kicker="AI policy" title="AI-generated content: not enabled">28        <p>Phase 1 contains no AI-generated text. When AI synthesis is introduced, it will be database-grounded only (answers must cite records present in the index), cached with the model name, prompt version and record snapshot, and always labelled "AI-generated". Language models are never used to map source labels to entities; at most they propose candidates that a curator reviews.</p>29      </Section>30      <Section id="privacy" kicker="Privacy" title="Privacy">31        <p>CancerIndex holds no patient-level data: all statistics are aggregate and published by their sources. The site sets no tracking cookies; the only cookie is the administrator session. Server logs retain IP addresses for a short period for abuse prevention.</p>32      </Section>33      <Section id="security" kicker="Security" title="Security">34        <p>Read-only public access; administrative actions require a token and are written to an audit log. Connectors run with rate limits, idempotent writes and an anomaly guard that refuses destructive updates when a source shrinks unexpectedly. Report vulnerabilities to {CONTACT_EMAIL}.</p>35      </Section>36      <Section id="sources" kicker="Source policy" title="Source policy">37        <p>38          A connector goes live only after its license is reviewed; sources under review are listed with no public records. Attribution requirements are honoured on every page and in exports. See the <Link className="ci-link" href="/sources">source registry</Link>.39        </p>40      </Section>41      <Section id="corrections" kicker="Corrections" title="Corrections and takedowns">42        <p>43          Found an error, a mis-mapped label or a licensing concern? Write to <a className="ci-link" href={`mailto:${CONTACT_EMAIL}`}>{CONTACT_EMAIL}</a> with the page URL and the identifier (CI-…). Corrections are recorded as change events on the affected entity.44        </p>45      </Section>46    </div>47  );48}49