Archilyzer · Source

archilyzer

Archilyzer
git clone https://archilyzer.pages.dev/source/archilyzer.git
Log | Files | Refs | README | LICENSE

commit af2e7c2f1dcc973965ee5b817ea6c8ae0541c2d9
parent f111b66baa23a7d06cfaa8f9c613d0dfb0c3bbcd
Author: I Mean I'm Just Saying <imeanimjustsaying@kiwifarms.st>
Date:   Mon,  5 Oct 2026 13:47:22 -0400

reports: a series is its own line above the title (still inside the heading)

ReportName renders the series and the title as two block lines, the series in the
accent; the heading's name stays "<series> <title>", and reportFullTitle stays
`<series>: <title>` wherever one line names the report. Docs, views comments,
REPORT.md and the unit assertion follow.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

Diffstat:
MREPORT.md | 2+-
Mcommon/lib/report/schema.ts | 2+-
Mcommon/lib/report/views.ts | 6++++--
Mexport/CHANGELOG.md | 2+-
Mexport/app/components/reports/parts.tsx | 12+++++++-----
Mexport/app/lib/reports.test.ts | 4++--
6 files changed, 16 insertions(+), 12 deletions(-)

diff --git a/REPORT.md b/REPORT.md @@ -18,7 +18,7 @@ Regenerate this file with `pnpm --filter yt-dlp-transcript-common exec tsx bin/f | `version` | yes | `1`. | | `id` | yes | The report's id: a lowercase slug (`[a-z0-9][a-z0-9-]*`, at most 64), its directory name under `reports/` and the last segment of its page, `/reports/<id>/`. Must match the directory. | | `kind` | yes | `"factcheck"` — sections of claims, each with a verdict — or `"sweep"` — sections with no verdicts, or bodies with inline citations. | -| `series` | no | The series the report belongs to: a recurring name for its kind of report. It leads the title in the accent colour, in place of the kind's label, and is joined to it as `<series>: <title>` where one line names the report (a page title, a link, a cited-in entry). | +| `series` | no | The series the report belongs to: a recurring name for its kind of report. It is shown on its own line above the title, in the accent colour, in place of the kind's label, and is joined to it as `<series>: <title>` where one line names the report (a page title, a link, a cited-in entry). | | `title` | yes | The report's title. | | `subtitle` | no | A line under the title. | | `summary` | no | The report's summary, in markdown, shown before the sections. May cite inline: `[label](cite:<id>)`. | diff --git a/common/lib/report/schema.ts b/common/lib/report/schema.ts @@ -97,7 +97,7 @@ export const REPORT_FIELD_DOCS: FieldDocs<Report> = { version: `\`${REPORT_VERSION}\`.`, id: "The report's id: a lowercase slug (`[a-z0-9][a-z0-9-]*`, at most 64), its directory name under `reports/` and the last segment of its page, `/reports/<id>/`. Must match the directory.", kind: '`"factcheck"` — sections of claims, each with a verdict — or `"sweep"` — sections with no verdicts, or bodies with inline citations.', - series: "The series the report belongs to: a recurring name for its kind of report. It leads the title in the accent colour, in place of the kind's label, and is joined to it as `<series>: <title>` where one line names the report (a page title, a link, a cited-in entry).", + series: "The series the report belongs to: a recurring name for its kind of report. It is shown on its own line above the title, in the accent colour, in place of the kind's label, and is joined to it as `<series>: <title>` where one line names the report (a page title, a link, a cited-in entry).", title: "The report's title.", subtitle: "A line under the title.", summary: "The report's summary, in markdown, shown before the sections. May cite inline: `[label](cite:<id>)`.", diff --git a/common/lib/report/views.ts b/common/lib/report/views.ts @@ -230,7 +230,8 @@ export type ReportPageView = { version: typeof REPORT_VIEWS_VERSION; id: string; kind: ReportKind; - // Shown above the title in place of the kind's label; `<series>: <title>` on one line. + // Its own line above the title, in place of the kind's label; `<series>: <title>` + // where one line names the report (reportFullTitle). series?: string; title: string; subtitle?: string; @@ -257,7 +258,8 @@ export type VerdictCount = { verdict: Verdict; count: number }; export type ReportIndexEntry = { id: string; kind: ReportKind; - // Shown above the title in place of the kind's label; `<series>: <title>` on one line. + // Its own line above the title, in place of the kind's label; `<series>: <title>` + // where one line names the report (reportFullTitle). series?: string; title: string; subtitle?: string; diff --git a/export/CHANGELOG.md b/export/CHANGELOG.md @@ -3,7 +3,7 @@ ## [Unreleased] - **A report's claim can carry a flag, and a site with one report names it in the browser tab.** `report.json` claim `flag` (one line, at most 60 characters) shows as a small pill in the accent colour beside the claim's verdict, e.g. "No source given". On a report-only site with one report, the home page's tab title is the report's, as on the report's own page, where it was the site's title alone. Needs a rebuild and deploy of the site. - **A report-only site with one report opens on that report.** Its home page is the report itself, its header links nothing, and `/reports/` forwards home: there is no index of one. With more reports the home page is the list, without repeating the site's title under the header; a list entry is the report's name, subtitle and dates (its counts and tally are on its page). Pages a report-only site does not have link home. -- **A report can belong to a series.** `report.json` `series` leads the report's title in the accent colour, in place of the kind's label ("Fact-check"); a page title, a cited-in link, `llms.txt` and the MCP name it `<series>: <title>`. +- **A report can belong to a series.** `report.json` `series` is shown on its own line above the report's title, in the accent colour, in place of the kind's label ("Fact-check"); a page title, a cited-in link, `llms.txt` and the MCP name it `<series>: <title>`. - **`pnpm start:export` serves a built site's moment pages.** It used `serve`, which listed a video or audio moment's directory (`3126.00-3151.00`) instead of serving its page; it now runs `export/scripts/serve-out.mjs`, which serves directories as Cloudflare Pages does, on `EXPORT_DEV_PORT` (3000). - **MCP: a site's reports can be read, and a site that publishes only reports says so instead of looking empty.** Two new tools: `list_reports` lists the reports a site publishes (id, title, kind, claim and citation counts, a fact-check's verdict tally, its page), and `get_report` reads one — its tally, then each section's claims with their verdicts and findings and, for every citation, the verbatim quote, the original (the platform at the cited second, the post, the document) and the site's moment page; `section` reads one section. On a site that publishes only its reports, `list_channels`, `list_sources` and `resolve_source` say "cited-only site: N report(s)" where they said "No channels found"; on a site with reports as well, `list_sources` and `resolve_source` say how many. The archive readers (local, remote) read `corpus.json` spec 5: a cited site is an empty corpus without an error, and a local copy of one is never read from a stale `transcripts/` folder. A hub has no reports of its own; `list_reports` says to name a member site. - **The hub leaves out a site that publishes only its reports.** A site with search off (`search: false`) is not a searchable archive, so it is no hub member (not in federated search, the hub's `corpus.json` or `llms.txt`) and no other site's footer links to it, whatever its **List on the Archilyzer homepage and hub** setting says. A site with reports that publishes its full corpus is a member as before. Needs a hub rebuild and deploy once such a site exists. diff --git a/export/app/components/reports/parts.tsx b/export/app/components/reports/parts.tsx @@ -16,17 +16,19 @@ export function Eyebrow({ children }: { children: React.ReactNode }) { return <p className="font-mono text-xs uppercase tracking-[0.18em] text-brand">{children}</p>; } -// A report's name as a heading. With a series, the series leads in the accent -// (the tag, like a wordmark's lead) and the title follows in regular weight; -// without one, the title alone (the kind's label is then the eyebrow above). +// A report's name as a heading. With a series, the series is its own line in +// the accent (the tag, like a wordmark's lead) and the title the next, in +// regular weight — both inside the heading, so its name reads "<series> +// <title>"; without one, the title alone (the kind's label is then the +// eyebrow above). export function ReportName({ series, title }: { series?: string; title: string }) { if (!series) return <>{title}</>; return ( <> - <span data-report-series="" className="font-semibold text-brand"> + <span data-report-series="" className="block font-semibold text-brand"> {series} </span>{" "} - <span className="font-normal">{title}</span> + <span className="block font-normal">{title}</span> </> ); } diff --git a/export/app/lib/reports.test.ts b/export/app/lib/reports.test.ts @@ -189,9 +189,9 @@ test("a cited site with more than one report: its home is the index, with no hea assert.match(idx, /data-report-entry="demo-factcheck"/); assert.doesNotMatch(idx, /claims ·|data-verdict-tally/, "counts and tally are the report page's"); assert.doesNotMatch(idx, /http-equiv="refresh"/); - // A series leads its title in the accent, in place of the kind's eyebrow. + // A series is its own line above the title, in the accent, in place of the kind's eyebrow. const second = html.slice(html.indexOf('data-report-entry="demo-second"')); - assert.match(second, /<span data-report-series="" class="font-semibold text-brand">On the Record<\/span> <span class="font-normal">A second report<\/span>/); + assert.match(second, /<span data-report-series="" class="block font-semibold text-brand">On the Record<\/span> <span class="block font-normal">A second report<\/span>/); assert.doesNotMatch(second.slice(0, second.indexOf("</li>")), /Fact-check/); const first = html.slice(html.indexOf('data-report-entry="demo-factcheck"')); assert.match(first.slice(0, first.indexOf("</li>")), /Fact-check/, "no series: the kind's eyebrow as before");