SPB Git

ui: tighter header on narrow screens; docs: verification log for the initial release

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Simon-Pierre Boucher committed (Nov 2, 2026) parent 734affb Browse files

2 changed files +14 −2

modified docs/verification.md +12 −0
@@ -1,3 +1,15 @@
1 1 # Verification log
2 2
3 3 Filled at each release. See the bottom of this file for the latest run.
4 +
5 +## 2026-11-02 — initial release (commit 734affb and later), https://wp.spboucher.ai on M3U96b
6 +
7 +| Check | Result |
8 +|---|---|
9 +| Unit tests (`pnpm test`, vitest) | 23/23 passed (identifiers, citations APA/Chicago/BibTeX/RIS, extraction heuristics, chunking, lexical vectors, i18n key parity and date precision) |
10 +| End-to-end (`pnpm test:e2e`, Playwright, desktop Chrome + iPhone 14 viewport, against production) | 19 passed, 1 skipped (mobile-only test on desktop): home statistics = API stats, library filters/sort/display modes, paper page (Scholar meta, JSON-LD, cite dialog, versions, related, PDF HEAD 200), identifier aliases 308, unknown/reserved 404, French locale, search highlights, all discovery pages, machine endpoints (BibTeX, OAI, RSS, sitemap, graph, health), mobile menu, admin unauthenticated refusal, admin login → forced password change page |
11 +| Security audit (`pnpm test:security https://wp.spboucher.ai`) | 27/27 passed: CSP/HSTS/XFO/nosniff/referrer/permissions headers, no `x-powered-by`, admin redirects + noindex + no-store, upload/preview 401 without session, cross-origin POST rejected, event input validation, SQL-injection attempt harmless, unknown file 404, path traversal blocked, reserved identifiers hidden (pages, API, OAI), search rate limit 60/min, robots disallow /admin, no secrets in HTML |
12 +| Deployment verification (`pnpm verify:deploy https://wp.spboucher.ai`) | 38/38 passed: TLS + health < 2 s, stats = health = list total = OAI record count (39), manuscript download with SHA-256 header, 21 routes 200, Scholar/DC/JSON-LD/hreflang, FR render distinct, 308 alias, 404s, admin protected |
13 +| Worker pipeline | 39/39 manuscripts: integrity OK, 5,139 full-text chunks, previews, lexical vectors; 39/39 paper embeddings and 5,139/5,139 chunk embeddings (OpenAI `text-embedding-3-small`, model verified via API); relations: 498 topic, 396 method, 28 dataset, 2 author, 156 lexical (inferred), 151 semantic (inferred) |
14 +| Backup + restore drill | Nightly job ran (pg_dump + manuscripts, AES-256, rsync to M3U96a OK); `pnpm restore:drill` restored the encrypted dump into a scratch DB: papers 41/41, versions 39/39, files 39/39, authors 3/3, topics 36/36, chunks 5,139/5,139 |
15 +| Infrastructure | DNS unchanged (pre-existing A record), Caddy route added by `mld deploy`, Let's Encrypt certificate issued, PM2 `wp-web` + `wp-worker` online, registry updated, `mld adopt` done (node clone = source of truth) |
modified src/components/site-header.tsx +2 −2
@@ -14,9 +14,9 @@ export function SiteHeader({ locale }: { locale: Locale }) {
14 14 const active = (p: string) => canonical === p || (p !== "/" && canonical.startsWith(p + "/"));
15 15 return (
16 16 <header className="sticky top-0 z-40 border-b border-line bg-bg/90 backdrop-blur supports-[backdrop-filter]:bg-bg/75">
17 − <div className="container flex items-center gap-3 h-16">
17 + <div className="container flex items-center gap-2 sm:gap-3 h-16">
18 18 <Link href={href(locale, "/")} className="flex items-baseline gap-2 no-underline min-w-0">
19 − <span className="serif text-lg sm:text-xl text-fg whitespace-nowrap">{d.site.title}</span>
19 + <span className="serif text-[1.05rem] sm:text-xl text-fg whitespace-nowrap truncate">{d.site.title}</span>
20 20 <span className="hidden lg:inline text-xs uppercase tracking-[.14em] text-fg-3">{d.site.affiliation}</span>
21 21 </Link>
22 22 <nav aria-label="Primary" className="hidden md:flex items-center gap-1 ml-auto">
23 23
Menu

Theme